עצים וגרפיםבינוני6 דק' קריאה
ערמה בינארית - מבנה הנתונים שמאחורי תור עדיפויות
איך ערמה מאחסנת תור עדיפויות במערך ומבצעת insert ו-extract ב-O(log n).
ערמה בינארית (Binary Heap) היא עץ בינארי שלם המקיים את 'תכונת הערמה': ב-max-heap, ערך כל צומת ≥ ערכי בניו; ב-min-heap, ערך כל צומת ≤ ערכי בניו. השורש תמיד מכיל את הערך המקסימלי (או המינימלי).
ייצוג חכם - מערך במקום עץ עם מצביעים
מכיוון שהעץ שלם, אפשר לאחסן אותו במערך פשוט בלי מצביעים: לצומת באינדקס i, הבנים נמצאים ב-2i+1 ו-2i+2, וההורה ב-(i-1)/2. זה חוסך זיכרון ומשפר את ניצול המטמון.
// Max-heap stored as array
const heap = [50, 30, 40, 10, 20, 35];
// 50
// / \
// 30 40
// / \ /
// 10 20 35פעולת Insert
- מוסיפים את הערך החדש בסוף המערך (התא הפנוי הבא)
- מבצעים sift-up: כל עוד הערך גדול מההורה, מחליפים איתו
- סיבוכיות: O(log n) - עומק העץ
פעולת Extract-Max
- שומרים את ערך השורש (זה המקסימום)
- מעבירים את האלמנט האחרון לראש
- מבצעים sift-down: מחליפים עם הבן הגדול יותר עד שהתכונה מתקיימת
- סיבוכיות: O(log n)
Heapify - בניית ערמה ממערך קיים
אפשר לבנות ערמה ממערך לא ממוין ב-O(n) (ולא O(n log n)!) על ידי הרצת sift-down מהאלמנט האמצעי לאחור. זה הבסיס של אלגוריתם Heap Sort.
ערמה היא הבחירה הטבעית בכל מקום שצריך להוציא שוב ושוב את הערך המקסימלי/מינימלי - Dijkstra, A*, מיזוג k רשימות ממוינות, top-k elements.