Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

ערימת מינימום - Heap הגדרה: מבנה נתונים שמוגדרות עליו הפעולות הבאות:

Liknende presentasjoner


Presentasjon om: "ערימת מינימום - Heap הגדרה: מבנה נתונים שמוגדרות עליו הפעולות הבאות:"— Utskrift av presentasjonen:

1 amirrub@cs - אמיר רובינשטיין
ערימת מינימום - Heap הגדרה: מבנה נתונים שמוגדרות עליו הפעולות הבאות: Make_heap – בניית ערימה מ- n איברים מהקלט. Insert(x) – הכנסת איבר x לערימה. Find_min – מציאת המינימום. Del_min – הוצאת המינימום מהערימה. 2. שימושים: תור עדיפויות, מיון ערימה (heap sort)... 3. מימושים: א. עץ חיפוש מאוזן עם מצביע למינימום שמתעדכן בהכנסה/הוצאה. ב. עץ כמעט שלם מימוש ע"י מערך מימוש ע"י עץ - אמיר רובינשטיין

2 amirrub@cs - אמיר רובינשטיין
3. מימושים: א. עץ חיפוש מאוזן עם מצביע למינימום שמתעדכן בהכנסה/הוצאה. ב. עץ כמעט שלם מימוש ע"י מערך מימוש ע"י עץ א. מימוש ערימה כעץ חיפוש מאוזן Make_heap – הכנס לעץ את כל n האיברים O(nlogn) Insert(x) – הכנס את x לעץ, אם צריך עדכן את המינימום O(logn) Find_min – החזר את הערך המוצבע ע"י המצביע למינימום O(1) Del_min – הוצא את המינימום מהעץ ומצא מינימום חדש O(logn) מימוש ערימה כעץ כמעט שלם משפר את סיבוכיות Make_heap ל- O(n). - אמיר רובינשטיין

3 amirrub@cs - אמיר רובינשטיין
עץ כמעט שלם עץ שלם – עץ בינארי בו לכל צומת פנימי בדיוק שני בנים, וכל העלים בעץ באותה רמה. עץ כמעט שלם – עץ שלם שבו חסרים (אולי) צמתים אחרונים. נמספר את הצמתים משמאל לימין ומלמעלה למטה. נקרא למספרים אלו אינדקסים. - אמיר רובינשטיין

4 amirrub@cs - אמיר רובינשטיין
תכונות של עץ כמעט שלם אם מספר הצמתים בעץ הוא n, וגובהו של העץ הוא h, מתקיים: מכאן . מספר העלים בעץ הינו , ומספר הצמתים הפנימיים אינדקס השורש תמיד 1. עבור צומת i – אינדקס בנו השמאלי הוא 2i ובנו הימני 2i+1. לכן צומת הוא בן שמאלי אם"ם יש לו אינדקס זוגי. עבור צומת i – האינדקס של אביו הוא . העלה האחרון הוא בעל אינדקס n. צומת חדש שיוכנס יקבל את האינדקס n+1. צומת i הוא עלה אם"ם 2i > n. - אמיר רובינשטיין

5 amirrub@cs - אמיר רובינשטיין
ב. מימוש ערימה כעץ כמעט שלם מימוש במערך בעץ בינארי תכונת הערימה (מינימום) – כל בן גדול מאביו. תכונות מימוש במערך (אם ידוע חסם על מספר האיברים בערימה). - אינדקסים של הצמתים ישמשו כאינדקסים של כניסות המערך. - ניתן להגיע מבן לאב ולהפך ב- O(1). - מקום פנוי בערימה להוספת איברים נמצא תמיד בסוף המערך. - נשמור גם את מספר האיברים שיש בערימה (תאים מנוצלים במערך). Make_heap – נכניס את n האיברים למערך. נעבור על כל הצמתים הפנימיים מהאחרון עד לשורש (כלומר מהאינדקס עד ל- 0) ונבצע Sift_Down לכל צומת. Insert(x) – איבר חדש יוכנס במקום הפנוי הראשון של המערך, ולאחר מכן יש לבצע Sift_Up לאורך המסלול החל מהצומת החדש עד לשורש. Del_min – נחליף את הערכים בין השורש לעלה האחרון. נמחק את העלה ונבצע Sift_Down החל מהשורש. Find_min – יש להחזיר את ערכו של השורש (אינדקס 0). 2 3 4 6 12 10 17 5 8 O(n) logn logn O(1) - אמיר רובינשטיין

6 amirrub@cs - אמיר רובינשטיין
Make heap - אמיר רובינשטיין

7 amirrub@cs - אמיר רובינשטיין
Insert - אמיר רובינשטיין

8 amirrub@cs - אמיר רובינשטיין
Del_min - אמיר רובינשטיין

9 amirrub@cs - אמיר רובינשטיין
ב. מימוש ערימה כעץ כמעט שלם מימוש במערך בעץ בינארי עץ בינארי נחזיק גם מצביע לעלה האחרון בעץ. - מאפשר מציאת המקום להכנסה ב- O(logn). מהם השינויים במימוש הפעולות מהמימוש ע"י מערך? Make_heap –נעבור על הצמתים הפנימיים בסדר postorder (כדי שבנים יטופלו לפני הוריהם). Insert(x) – המקום הפנוי להכנסה יימצא ע"י המצביע לעלה האחרון ב- O(logn): נעלה ממנו עד לצומת ממנו אפשר לרדת ימינה, ואז כל הדרך שמאלה. Del_min – נחליף את הערכים בין השורש לעלה האחרון באמצעות המצביע. 2 11 7 9 34 - אמיר רובינשטיין

10 amirrub@cs - אמיר רובינשטיין
שאלה: נתון עץ כמעט שלם הממומש ע"י עץ דינאמי. איך מוצאים צומת בעץ בעל אינדקס i ? פתרון: נסתכל על הייצוג הבינארי של האינדקס שאנו מחפשים i. למשל: 9=1001. נצעד מהשורש במורד העץ באופן הבא: לכל ביט בייצוג הבינארי החל מהביט השני עבור 0 נרד שמאלה, עבור 1 נרד ימינה. - אמיר רובינשטיין

11 amirrub@cs - אמיר רובינשטיין
לסיכום: עץ כמעט שלם (כמערך או עץ) עץ חיפוש מאוזן O(n) O(nlogn) Make_heap O(logn) Insert(x) O(1) Find_min Del_min - אמיר רובינשטיין

12 amirrub@cs - אמיר רובינשטיין
תרגיל 1: נתונה רשימה מקושרת של מספרים ממשיים וידוע גם ערך החציון. יש לממש את הפעולות הבאות: init – אתחול מבנה הנתונים ב- O(m), m מספר האיברים ברשימה. insert(x) – הוסף את x למבנה ב- O(logn), n מספר האיברים במבנה. find_mid – החזר את ערך החציון ב- O(1). del_mid – הוצא את החציון מהמבנה ב- O(logn). פתרון: ערימת מינימום ערימת מקסימום של האיברים הגדולים של האיברים הקטנים L S 9 5 3 2 11 12 18 20 34 - אמיר רובינשטיין

13 amirrub@cs - אמיר רובינשטיין
פתרון: ערימת מינימום ערימת מקסימום של האיברים הגדולים של האיברים הקטנים l=|L| s=|S| Init – ערך החציון ידוע לכן נחלק ב- O(m) את האיברים לשתי קבוצות: קטנים וגדולים/שווים מהחציון. לאחר מכן נריץ make_heap מכל קבוצה. O(m)+2O(m/2)=O(m). חfind_mid - החזר את ערך השורש הערימה הימנית L, O(1). insert(x) – אם x קטן מהחציון, נכניס אותו ל- S, אחרת ל- L. נעדכן את גדלי הערמות אם |S|=|L|+1 נעביר את השורש של S ל- L אם |S|=|L| -2 נעביר את השורש של L ל- S. הdel_mid – הוצא את השורש של L. אם |S|=|L|+1 נעביר את השורש של S ל- L. שתי הפעולות האחרונות במקרה הגרוע: 9 5 3 2 11 12 18 20 34 - אמיר רובינשטיין

14 amirrub@cs - אמיר רובינשטיין
תרגיל 2: תאר מבנה נתונים המאפשר ביצוע הפעולות הבאות בסיבוכיות הנדרשת: init – אתחול מבנה הנתונים – O(n). insert(x) – הוסף את x למבנה – O(logn). find_min – החזר את המינימום – O(1). find_max – החזר את המקסימום – O(1). del_min – הוצא את המינימום מהמבנה – O(logn). del_max – הוצא את המקסימום מהמבנה – O(logn). פתרון: נשמור את האיברים בשתי ערמות בו זמנית: ערימת מינימום וערימת מקסימום בין כל שני איברים "תאומים" בשתי הערימות יהיו מצביעים הדדיים. 8 6 4 3 1 5 1 5 3 8 4 6 - אמיר רובינשטיין

15 amirrub@cs - אמיר רובינשטיין
8 6 4 3 1 5 1 5 3 8 4 6 del_min: נמחק את השורש של ערימה המינימום ואת הצומת ה"תאום" מערימת המקסימום. אבחנה: הצומת התאום של שורש ערימה אחת הוא עלה בערימה השניה. כיצד מוחקים עלה מערימה? מחליפים בינו לבין העלה האחרון מוחקים את העלה האחרון מבצעים Sift_Up מהמקום המקורי של הצומת שנמחק. - אמיר רובינשטיין

16 amirrub@cs - אמיר רובינשטיין
תרגיל 2: פתרון שני: נשמור את האיברים בערימת מינימום. בכל צומת יהיה שדה נוסף max, שישמור את הערך המקסימלי בתת העץ של הצומת (כולל הצומת עצמו). init – בצע Make_Heap ואח"כ סיור Postorder לחישוב שדות ה- max. O(n). insert(x) – הכנס את x לערימה ועדכן את שדות max במסלול מלמטה עד לשורש. O(logn). find_min – החזר את ערך השורש. O(1). find_max – החזר את ערך max של השורש. O(1). del_min – הוצא את השורש. עדכן את שדות max לאורך 2 מסלולים: המסלול מהעלה האחרון (זה שנמחק) עד לשורש, והמסלול של ה- Sift_Down מהשורש למטה O(logn). del_max – נמצא את צומת המקסימום כך: מהשורש נרד כל פעם לבן המקסימלי עד שנגיע לעלה. כעת נמחק צומת זה ע"י החלפתו עם העלה האחרון, ו- Sift_Up. נעדכן שדות ה- max לאורך 2 מסלולים. O(logn). 8 1 8 6 3 5 8 4 6 8 4 6 - אמיר רובינשטיין


Laste ned ppt "ערימת מינימום - Heap הגדרה: מבנה נתונים שמוגדרות עליו הפעולות הבאות:"

Liknende presentasjoner


Annonser fra Google