prepd.

שאלת מבחן במבני נתונים ומבוא לאלגוריתמים - האוניברסיטה הפתוחה 2020 - ערימות

ברצוננו לבנות ערמת מקסימום בת איברים; לכל איבר בערמה נוסיף שדה , המאחסן את הערך המינימלי בתת-ערמה המושרשת ב-. הראו כיצד ניתן לשנות את השגרה BUILD-HEAP(), כך שבניית הערמה המכילה את השדות עדיין תתבצע בזמן לינארי.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
שאלה חוזרתהאוניברסיטה הפתוחהמבחן סמסטר ב2020 סמסטר ב | 2020 סמסטר ב
ערימותסיבוכיות
בשגרת BUILD-HEAP הרגילה, אנו עוברים מהצמתים האחרונים לשורש ומבצעים HEAPIFY. חשבו כיצד ניתן לחשב את בזמן לכל צומת תוך כדי התהליך.
הרעיון: בשגרת BUILD-HEAP המקורית, עוברים על הצמתים מלמטה למעלה (מאינדקס עד 1) ומבצעים MAX-HEAPIFY.

שינוי: לאחר שמבצעים 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 לוקח
(פעולה אחת בזמן לכל צומת).

סה"כ:
זמן לינארי.
שאלת מבחן במבני נתונים ומבוא לאלגוריתמים - האוניברסיטה הפתוחה 2020 | prepd.