שאלת מבחן במבני נתונים ומבוא לאלגוריתמים - האוניברסיטה הפתוחה 2020 - ערימות
ברצוננו לבנות ערמת מקסימום בת איברים; לכל איבר בערמה נוסיף שדה , המאחסן את הערך המינימלי בתת-ערמה המושרשת ב-. הראו כיצד ניתן לשנות את השגרה BUILD-HEAP(), כך שבניית הערמה המכילה את השדות עדיין תתבצע בזמן לינארי.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
שאלה חוזרתהאוניברסיטה הפתוחהמבחן סמסטר ב2020 סמסטר ב | 2020 סמסטר ב
★★★★★
ערימותסיבוכיות
בשגרת BUILD-HEAP הרגילה, אנו עוברים מהצמתים האחרונים לשורש ומבצעים HEAPIFY. חשבו כיצד ניתן לחשב את בזמן לכל צומת תוך כדי התהליך.
הרעיון: בשגרת BUILD-HEAP המקורית, עוברים על הצמתים מלמטה למעלה (מאינדקס עד 1) ומבצעים MAX-HEAPIFY.
שינוי: לאחר שמבצעים MAX-HEAPIFY לצומת , נחשב את באופן הבא:
חשוב: צריך לחשב את אחרי ה-HEAPIFY, כי HEAPIFY עשוי להחליף איברים.
למעשה, עדיף לשלב את חישוב בתוך HEAPIFY עצמו. בכל פעם שמבצעים החלפה ב-HEAPIFY ויורדים לבן, מעדכנים את של האב.
אלטרנטיבה פשוטה יותר:
1. מבצעים BUILD-HEAP רגיל – .
2. עוברים על כל הצמתים מלמטה למעלה (מהעלים לשורש), ולכל צומת :
(עם התייחסות מתאימה לעלים, שם .)
שלב 2 לוקח (פעולה אחת בזמן לכל צומת).
סה"כ: – זמן לינארי.
שינוי: לאחר שמבצעים MAX-HEAPIFY לצומת , נחשב את באופן הבא:
min[i] = key[i]
if left[i] ≤ heap-size:
min[i] = min(min[i], min[left[i]])
if right[i] ≤ heap-size:
min[i] = min(min[i], min[right[i]])
חשוב: צריך לחשב את אחרי ה-HEAPIFY, כי HEAPIFY עשוי להחליף איברים.
למעשה, עדיף לשלב את חישוב בתוך HEAPIFY עצמו. בכל פעם שמבצעים החלפה ב-HEAPIFY ויורדים לבן, מעדכנים את של האב.
אלטרנטיבה פשוטה יותר:
1. מבצעים BUILD-HEAP רגיל – .
2. עוברים על כל הצמתים מלמטה למעלה (מהעלים לשורש), ולכל צומת :
(עם התייחסות מתאימה לעלים, שם .)
שלב 2 לוקח (פעולה אחת בזמן לכל צומת).
סה"כ: – זמן לינארי.