- הגשות
- פתרונות
- פתרון רשמי
- תיאור
א. נתון עץ ערכי מיקום, כאשר כל צומת מתואר על ידי הזוג (מפתח, גודל):
- שורש: (26, 20)
- ילדיו של (26, 20): שמאל (17, 12), ימין (41, 7)
- ילדיו של (17, 12): שמאל (7, 7), ימין (21, 4)
- ילדיו של (41, 7): שמאל (30, 5), ימין (47, 1)
- ילדיו של (7, 7): שמאל (3, 1), ימין (10, 2)
- ילדיו של (21, 4): שמאל (19, 1), ימין (21, 1)
- ילדיו של (30, 5): שמאל (28, 1), ימין (38, 2)
- ילדיו של (10, 2): ימין (12, 1)
- ילדיו של (38, 2): שמאל (35, 1), ימין (39, 1)
(הערה: ייתכנו אי-דיוקים בתכונת הגודל של צמתים מסוימים. הניתוח יתבסס על הנתונים כפי שהם.)
- הריצו את האלגוריתם למציאת האיבר במיקום ה-18 (כלומר
OS_Select(root, 18)
). פרטו את השלבים. - הריצו את האלגוריתם למציאת הדירוג של האיבר עם מפתח 35 (כלומר
OS_Rank(T, x)
כאשר x הוא מצביע לצומת עם מפתח 35). פרטו את השלבים.
ב.
- נתון המערך הבא:
A=[27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0]
. במסגרת הפיכת המערך לערימה, מריצים את הפעולהheapify(A,3)
. הסבירו מדוע יש צורך בפעולה זו במסגרת בניית ערימה, והריצו את הפעולה. פרטו את השלבים. (הניחו אינדקסים מ-1 ושהכוונה היא לערימת מקסימום). - תארו אלגוריתם לבניית ערימה חוקית בגודל \(n\) שזמן ריצתו יהיה \(\Omega(n \log n)\). (הערה: בניית ערימה סטנדרטית באמצעות
Build-Heap
פועלת בזמן \(O(n)\). יש לחשוב על דרך חלופית).
עבור עץ ערכי מיקום, זכרו כיצד להשתמש בשדה הגודל כדי לנווט בעץ. עבור OS_Select
, השוו את הדרגה המבוקשת לגודל תת-העץ השמאלי. עבור OS_Rank
, צברו דרגות תוך כדי עלייה מהצומת לשורש. עבור heapify
, השוו את האב עם ילדיו והחליפו במידת הצורך באופן רקורסיבי. עבור סעיף ב.2, חשבו על אלגוריתם בנייה שאינו Build-Heap
הסטנדרטי.