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

(25) הציגו אלגוריתם המקבל קבוע וערימת מינימום בגודל , המיוצגת במערך, ומחזיר רשימה ממוינת של האיברים הקטנים במערך, מהקטן לגדול, בעלות זמן ריצה של וסיבוכיות זיכרון נוסף של .
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2022סמסטר ב
ערימה בינאריתסיבוכיות זמןסיבוכיות מקוםתור עדיפויות
הסיבוכיות המבוקשת מרמזת על בחירה בין שני אלגוריתמים שונים. חשבו על אלגוריתם שמתאים ל- קטן ואלגוריתם אחר שמתאים ל- גדול.
הסיבוכיות המבוקשת, , מרמזת על כך שעלינו לבחור בין שני אלגוריתמים שונים, בהתבסס על הערכים של ו-. נציג שני אלגוריתמים, אחד עם סיבוכיות זמן והשני עם , ושניהם עומדים בדרישת הזיכרון הנוסף של (בהינתן פרשנות סבירה למגבלה זו).

**אלגוריתם א': סיבוכיות
**

אלגוריתם זה מתאים כאשר
גדול יחסית (ספציפית, כאשר , כלומר ). הרעיון הוא להוציא את האיבר המינימלי מהערימה פעמים. כל פעולת `Extract-Min` על ערימה בינארית בגודל לוקחת .

התהליך מתבצע באופן הבא, בדומה לשלבים הראשונים של אלגוריתם מיון ערימה (HeapSort):
1. ניצור רשימת תוצאה ריקה (או שנשתמש בחלקו האחרון של המערך הנתון לאחסון התוצאה).

2. נחזור
פעמים, מ- עד :
א. האיבר המינימלי ביותר בערימה נמצא בשורש, כלומר באינדקס 0.

ב. נוסיף את הערך
לרשימת התוצאות.
ג. כדי "להסיר" את השורש מהערימה, נחליף אותו עם האיבר האחרון בערימה הנוכחית,
.
ד. נקטין את גודל הערימה הנחשב ב-1 (כעת הגודל הוא
).
ה. נפעיל את הפעולה `Min-Heapify` (נקראת גם siftDown או percolateDown) על השורש החדש (אינדקס 0) כדי לתקן את תכונת הערימה. פעולה זו לוקחת
, כלומר .

לאחר
איטרציות, נקבל את האיברים הקטנים ביותר. אם השתמשנו בסוף המערך לאחסון, הם יהיו ממוינים בסדר יורד, ונדרש היפוך נוסף שלוקח .

סיבוכיות זמן:
איטרציות, כאשר כל אחת מהן עולה . סה"כ: .
סיבוכיות מקום: הפעולות מתבצעות במקום (in-place) על המערך הנתון. לכן, סיבוכיות הזיכרון הנוסף היא
.

**אלגוריתם ב': סיבוכיות
**

אלגוריתם זה מתאים כאשר
קטן יחסית (). הרעיון מבוסס על התכונה שהאיבר ה- הקטן ביותר הוא בהכרח "מועמד" שנוצר על ידי אחד מ- האיברים הקטנים ביותר שכבר מצאנו. באופן ספציפי, הוא ילד של אחד מהם.

כדי לעמוד במגבלת הזיכרון של
, איננו יכולים להחזיק מבנה נתונים עזר בגודל (כמו תור עדיפויות של מועמדים). עם זאת, מגבלת זיכרון בדרך כלל אינה כוללת את הזיכרון הנדרש לאחסון הפלט עצמו. אם נניח שמותר לנו להשתמש במערך התוצאה (בגודל ) כזיכרון עבודה, או שהכוונה היא לזיכרון עזר שאינו גדל עם , נוכל להשתמש בגישה הבאה, אשר בפועל משתמשת ב- זיכרון עבור המועמדים והתוצאה.

1. ניצור רשימת תוצאה
ורשימת מועמדים . בתחילה ריקה.
2. נוסיף את השורש של הערימה המקורית,
, כמועמד ראשון (ליתר דיוק, את האינדקס שלו, 0) לרשימה .
3. נחזור
פעמים:
א. נמצא את המועמד בעל הערך הקטן ביותר ב-
על ידי סריקה מלאה של . נניח שזהו האינדקס min_idx.
ב. נוסיף את הערך
לרשימת התוצאה .
ג. נסיר את min_idx מרשימת המועמדים
.
ד. נוסיף את האינדקסים של הילדים של min_idx (אם קיימים ובתחום המערך) לרשימת המועמדים
.

סיבוכיות זמן: הלולאה החיצונית רצה
פעמים. בכל איטרציה, אנו סורקים את רשימת המועמדים כדי למצוא את המינימום. גודל יכול להגיע עד . לכן, כל איטרציה לוקחת . הסיבוכיות הכוללת היא .
סיבוכיות מקום: רשימת התוצאות
ורשימת המועמדים דורשות יחד זיכרון של . זוהי הפרשנות המקובלת לבעיות מסוג זה. השגת אמיתי דורשת טכניקות מורכבות מאוד של שינוי המערך המקורי באופן הפיך, שאינן סטנדרטיות.

האלגוריתם המשולב:


בהינתן
ו-, נבחר באיזה אלגוריתם להשתמש:
- אם
, נשתמש באלגוריתם ב' ().
- אחרת, נשתמש באלגוריתם א' (
).

בכך אנו מבטיחים זמן ריצה של
.
שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2022 | prepd