שאלת מבחן במבני נתונים ומבוא לאלגוריתמים - האוניברסיטה הפתוחה 2025 - ערימות
א) (13 נקודות) נתונה ערימת מינימום בגודל , שמפתחותיה הם מספרים ממשיים.
לצורך כלשהו הוספנו לכל המפתחות על גבי המסלול השמאלי את הקבוע .
כתוב שגרה לתיקון המבנה כך שיחזור להיות ערימת מינימום חוקית (באופן שהערימה נשארת עם תוספת ה- למפתחות המסויימים).
על השגרה לעבוד בזמן .
הערה: "המסלול השמאלי" מוגדר להיות המסלול היוצא מהשורש וממשיך רק שמאלה (אין פניות לבן הימני לאורך כל המסלול).
דוגמא: בערימת המינימום שבאיור, המסלול השמאלי הוא המסלול 3-4-10-21.
ב) (12 נקודות) נתון עץ חיפוש בינארי בגודל , שמפתחותיו הם מספרים טבעיים שונים זה מזה.
כתבו אלגוריתם למציאת שני צמתים שונים בעץ , המקיימים את התנאי . אם אין שני צמתים המקיימים את התנאי האלגוריתם מחזיר .
על השגרה לעבוד בזמן . מותר להקצות מקום נוסף.
אנא דייקו בכתיבת השגרה ואל תסתפקו בכתיבת הרעיון בלבד.
אנא דייקו בחישוב היעילות.
הערות:
לצורך כלשהו הוספנו לכל המפתחות על גבי המסלול השמאלי את הקבוע .
כתוב שגרה לתיקון המבנה כך שיחזור להיות ערימת מינימום חוקית (באופן שהערימה נשארת עם תוספת ה- למפתחות המסויימים).
על השגרה לעבוד בזמן .
הערה: "המסלול השמאלי" מוגדר להיות המסלול היוצא מהשורש וממשיך רק שמאלה (אין פניות לבן הימני לאורך כל המסלול).
דוגמא: בערימת המינימום שבאיור, המסלול השמאלי הוא המסלול 3-4-10-21.
ב) (12 נקודות) נתון עץ חיפוש בינארי בגודל , שמפתחותיו הם מספרים טבעיים שונים זה מזה.
כתבו אלגוריתם למציאת שני צמתים שונים בעץ , המקיימים את התנאי . אם אין שני צמתים המקיימים את התנאי האלגוריתם מחזיר .
על השגרה לעבוד בזמן . מותר להקצות מקום נוסף.
אנא דייקו בכתיבת השגרה ואל תסתפקו בכתיבת הרעיון בלבד.
אנא דייקו בחישוב היעילות.
הערות:
- שימו לב לפתור באופן עדין ולהקפיד על סדר הפעולות.
- אנא הקפידו על כתיבת רעיון, אלגוריתם, נכונות וסיבוכיות.
- כל אחד מהסעיפים עומד בפני עצמו, וניתן לפתרון גם אם לא פתרתם הסעיף האחר.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד ב2025סמסטר א
★★★★★
ערימותמבנה נתוניםסיבוכיותעצי חיפושאלגוריתמיםסריקת עציםמחסניות
סעיף א': לאחר הגדלת המפתחות במסלול השמאלי, תכונת הערימה עלולה להיות מופרת. יש לעבור על הצמתים ששונו ולהפעיל עליהם את פעולת התיקון הסטנדרטית בסדר הנכון. סעיף ב': חשבו כיצד הייתם פותרים את הבעיה אם הנתונים היו במערך ממוין, ונסו לדמות את הפתרון על עץ החיפוש הבינארי.
סעיף א
רעיון:הוספת קבוע למפתחות על המסלול השמאלי עלולה להפר את תכונת ערימת המינימום. הפרה כזו יכולה להתרחש רק בצמתים על המסלול עצמו, מכיוון שרק המפתחות שלהם השתנו. עבור צומת על המסלול, מפתח בן שמאלי שלו (אם קיים) נמצא גם הוא על המסלול, ולכן לשניהם הוסף . היחס ביניהם נשמר. הבעיה יכולה להיווצר רק בין לבין בנו הימני (שאינו על המסלול). לכן, יש צורך לתקן את תכונת הערימה עבור כל צומת על המסלול השמאלי. נעשה זאת על ידי קריאה ל-
Min-Heapify על כל צומת במסלול, מהעלה ועד לשורש, כדי להבטיח שתנאי הקדם של Min-Heapify (שהעצים התלויים בבנים הם ערימות חוקיות) מתקיים בכל קריאה.אלגוריתם:
Fix-Left-Path-Heap(A, C):
// Step 1: Find all nodes on the left path and add C to their keys
path_nodes = []
i = 1 // Start from root
while i <= A.heap_size:
A[i] = A[i] + C
path_nodes.append(i)
i = Left(i) // i = 2*i
// Step 2: Fix the heap property from bottom to top along the path
for i in reversed(path_nodes):
Min-Heapify(A, i)
כאשר Min-Heapify(A, i) היא הפעולה הסטנדרטית לתיקון ערימה בצומת i.נכונות:
לאחר הוספת למפתחות במסלול השמאלי, תכונת ערימת המינימום עלולה להיות מופרת רק בצמתים הנמצאים על המסלול. בפרט, ייתכן ש- יהיה גדול מ-. האלגוריתם עובר על צמתי המסלול מהעמוק ביותר (העלה) כלפי מעלה (השורש). נוכיח באינדוקציה הפוכה על עומק הצמתים במסלול, שלאחר הפעלת
Min-Heapify(A, v), תת-העץ המושרש ב- הוא ערימת מינימום חוקית.- בסיס: יהי הצומת העמוק ביותר על המסלול. בניו (אם קיימים) אינם על המסלול ולכן תתי-העצים שלהם הם ערימות מינימום חוקיות. לכן, תנאי הקדם של
Min-Heapify(A, v_k)מתקיים, ולאחר ביצוע הפעולה, תת-העץ המושרש ב- הוא ערימת מינימום חוקית. - צעד: נניח שהטענה נכונה עבור כל צומת על המסלול שעומקו גדול מזה של . כאשר אנו מפעילים
Min-Heapify(A, v_i), תת-העץ המושרש בבנו הימני הוא ערימה חוקית (כי הוא לא השתנה), ותת-העץ המושרש בבנו השמאלי, , הוא ערימה חוקית לפי הנחת האינדוקציה. לכן, תנאי הקדם מתקיימים, והפעולה תהפוך את תת-העץ המושרש ב- לערימת מינימום חוקית.
- אורך המסלול השמאלי הוא . מציאת הצמתים והוספת למפתחותיהם לוקחת זמן.
- הלולאה השנייה רצה פעמים. בכל איטרציה, עבור צומת בעומק , אנו מפעילים
Min-Heapifyשזמן ריצתו הוא פרופורציונלי לגובה תת-העץ שלו, כלומר . - הזמן הכולל הוא סכום זמני הריצה של
Min-Heapifyעל כל צמתי המסלול:
הסיבוכיות הכוללת היא .
סעיף ב
רעיון:המטרה היא . סריקה פנימית (in-order) של עץ חיפוש בינארי מניבה את המפתחות בסדר ממוין, ולכן הבעיה שקולה למציאת זוג איברים בסדרה ממוינת שסכומם שווה לערך קבוע. נשתמש בגישת שני המצביעים: מצביע מתחיל מהאיבר הקטן ביותר ומצביע מהאיבר הגדול ביותר. בכל צעד בודקים את הסכום : אם הוא קטן מהמטרה מקדמים את לעוקבו (successor), ואם הוא גדול ממנה מחזירים את לקודמו (predecessor).
כדי לעמוד בדרישת ** מקום נוסף** איננו משתמשים במחסניות. בעץ חיפוש בינארי סטנדרטי (כפי שמוגדר בספר הקורס) לכל צומת יש מצביע אב , ולכן ניתן לממש את
TREE-SUCCESSOR ו-TREE-PREDECESSOR תוך שימוש ב- מקום בלבד, ללא מבני עזר.הערה מבנית: היות שהמטרה היא , השורש מחלק את העץ — כל המפתחות בתת-העץ השמאלי קטנים מ- וכל המפתחות בתת-העץ הימני גדולים ממנו. לכן כל זוג חוקי מורכב בהכרח מצומת אחד מכל צד (שני צמתים מצד שמאל יתנו סכום הקטן מהמטרה, ושניים מימין — גדול ממנה), ובפרט אף אחד מהשניים אינו השורש (שכן בן-הזוג שלו היה צריך להיות בעל מפתח , וזה בלתי אפשרי שכן המפתחות שונים זה מזה).
אלגוריתם:
FIND-SUM-PAIR(T):
if T.root == NIL:
return FALSE
target = 2 * T.root.key
x = TREE-MINIMUM(T.root) // הצומת בעל המפתח הקטן ביותר
y = TREE-MAXIMUM(T.root) // הצומת בעל המפתח הגדול ביותר
while x != y and x.key < y.key:
s = x.key + y.key
if s == target:
return (x, y)
else if s < target:
x = TREE-SUCCESSOR(x) // מגדילים את הקצה הקטן
else:
y = TREE-PREDECESSOR(y) // מקטינים את הקצה הגדול
return FALSE
נכונות:המצביע מצביע תמיד על המפתח הקטן ביותר שטרם נשלל, ו- על הגדול ביותר שטרם נשלל. נסמן ו-.
- אם — מצאנו זוג. מאחר שהמצביעים טרם נפגשו, .
- אם — יש להגדיל את הסכום. הגדלת אינה אפשרית כי הוא הגדול ביותר שנותר, ולכן חובה להגדיל את , כלומר לעבור לעוקב של . כל זוג אחר הכולל את ייתן סכום קטן עוד יותר, ולכן ניתן לפסול את לצמיתות.
- אם — באופן סימטרי, חובה להחליף את בקודמו.
- מקום: האלגוריתם משתמש במספר קבוע של מצביעים ומשתנים () בלבד. מצביעי האב הם חלק ממבנה העץ הקיים ואינם הקצאה נוספת. לכן סיבוכיות המקום היא , כנדרש.
- זמן:
TREE-MINIMUMו-TREE-MAXIMUMעולים . בלולאה, מתקדם אך ורק קדימה (דרךTREE-SUCCESSOR) ו- אך ורק אחורה (דרךTREE-PREDECESSOR). סדרה של קריאותTREE-SUCCESSORהחל מהמינימום עוברת על כל קשת בעץ לכל היותר פעמיים, ולכן עלותה הכוללת היא (תרגיל 12.2-7 בספר), וכך גם עבורTREE-PREDECESSORהחל מהמקסימום. סך כל הקריאות חסום ב-, ומכאן שזמן הריצה הכולל הוא , כנדרש.