170 likes | 570 Views
תור עדיפויות/ערימה Heap. תור עדיפויות הוא מבנה נתונים המוגדר ע"י הפעולות הבאות: צור ערימה ריקה MakeHeap( Q ) - הכנס רשומה x לערימה - Insert( x , Q ) הדפס את הרשומה עם המפתח הגדול ביותר - Max( Q ) הוצא את הרשומה עם המפתח הגדול ביותר - DeleteMax( Q ). מימוש 1. עץ חיפוש מאוזן.
E N D
תור עדיפויות/ערימהHeap • תור עדיפויות הוא מבנה נתונים המוגדר ע"י הפעולות הבאות: • צור ערימה ריקה MakeHeap(Q) - • הכנס רשומה x לערימה - Insert(x,Q) • הדפס את הרשומה עם המפתח הגדול ביותר - Max(Q) • הוצא את הרשומה עם המפתח הגדול ביותר - DeleteMax(Q)
מימוש 1 עץ חיפוש מאוזן. MakeHeap(Q) O(1) Insert(x,Q) O(log(n)) Max(Q) O(1) DeleteMax(Q) O(log(n)) key info parent O(n) סיבוכיות מקום נוסף left right האם אפשר לממש בעזרת מבנה יותר פשוט?
מימוש 2: ערימה בעזרת עץ בינרי כמעט שלם 16 11 12 המפתח של הוֹרֶה גדול או שווה ממפתחות ילדיו (תנאי זה נקרא תכונת הערימה). 9 7 10 3 2 8 1 4 איפו נמצא האבר המקסימלי? MakeHeap(Q) O(1) Max(Q) O(1)
Insert(x,Q) 16 נשתמש בפרוצדורה sift-up 11 12 9 7 10 3 Insert(13,Q) 2 8 1
Insert(x,Q) 16 נשתמש בפרוצדורה sift-up 11 12 9 7 10 3 Insert(13,Q) 2 8 1 13
Insert(x,Q) 16 נשתמש בפרוצדורה sift-up 11 12 9 13 10 3 Insert(13,Q) 2 8 1 7
Insert(x,Q) 16 נשתמש בפרוצדורה sift-up 13 13 12 9 11 10 3 Insert(13,Q) Insert(5,Q) 2 8 1 7 5 5 סבוכיות זמן O(log(n))
DeleteMax(Q) 16 5 נשתמש בפרוצדורה sift-down 13 12 9 11 10 3 2 8 1 7 5 5
DeleteMax(Q) 5 נשתמש בפרוצדורה sift-down 13 12 9 11 10 3 2 8 1 7
DeleteMax(Q) 13 נשתמש בפרוצדורה sift-down 5 12 9 11 10 3 2 8 1 7
DeleteMax(Q) 13 נשתמש בפרוצדורה sift-down 11 12 9 5 10 3 2 8 1 7
DeleteMax(Q) 13 נשתמש בפרוצדורה sift-down 11 12 9 7 10 3 2 8 1 5 5 סבוכיות זמן O(log(n))
סיבוכיות מימוש 2: ערימה בעזרת עץ בינרי כמעט שלם MakeHeap(Q) O(1) Insert(x,Q) O(log(n)) Max(Q) O(1) DeleteMax(Q) O(log(n)) key parent O(n) סיבוכיות מקום נוסף left right האם אפשר לממש בעזרת מבנה עוד יותר פשוט?
1 16 מימוש 3: מערך 2 3 13 13 12 4 5 6 7 9 11 10 3 8 9 10 11 12 2 8 1 7 5 5 16 13 12 9 11 10 3 2 8 1 7 5 1 2 3 4 5 6 7 8 9 10 11 12 ההורה של צומת i הוא הצומת i/2, בן שמאלי של צומת i הוא הצומת 2i בן ימני של צומת i הוא הצומת 2i+1
מימוש 3: מערך MakeHeap(Q) O(1) Insert(x,Q) O(log(n)) Max(Q) O(1) DeleteMax(Q) O(log(n)) O(1) סיבוכיות מקום נוסף
תכונות מימוש 3: מערך 16 13 12 9 11 10 3 2 8 1 7 5 n =12 1 2 3 4 5 6 7 8 9 10 11 12 1 16 r 13 2 3 2r+1 2r 13 13 12 4 5 6 7 9 11 10 3 הלא-עלה האחרון n/2 8 9 10 11 12 העלה הראשון n/2+1 2 8 1 7 5 5
פרוצדורה sift-down sift_down { int r; for (r = 1; r <= n/2; ){ /* n/2 is the last non-leaf */ if (2r = = n){ /* r has one child at 2*r */ if (a[r] > a[2*r]) swap(r,2*r); break; } else {/*r has two children at 2*r and 2*r+1 */ if (a[r] > a[2*r] && a[2*r] <= a[2*r+1]){ swap(r, 2*r); r *= 2; } else if (a[r] > a[2*r + 1] && a[2*r + 1] <= a[2*r]){ swap(r, 2*r + 1); r * = 2*r + 1; } else break; { { } r 13 2r 2r+1