שאלת מבחן באלגוריתמים - האוניברסיטה הפתוחה 2021 - סיבוכיות
שאלה 2 – תור-קדימויות (אלגוריתמים חמדניים על גרפים)
השאלה דנה במימושים שונים לתור-קדימויות עם מפתחות, במסגרת הפעלת האלגוריתם של Dijkstra או של Prim. מימוש פשוט במיוחד הוא לשמור את כל המפתחות ברשימה דו-כיוונית ללא שום דרישת-סדר (להלן "רשימה". בפרט, הרשימה אינה ממוינת). ערימת-פיבונאצ'י הינה מימוש מחוכם, שאינו נלמד בקורס, אך זמני-הריצה שלו רשומים להלן (למען הדיוק, רשומים מעין זמני-ריצה "ממוצעים", אך ניתן להוכיח כי לעובדה זו אין השפעה על זמן-הריצה הכולל של האלגוריתמים, ולכן יש להתעלם מאבחנה זו). לכל אורך התשובה יש להשמיט את הסימנים האסימפטוטיים .
(א) השלימו בטבלה הבאה את זמני-הריצה עבור כל סוג של פעולה.
(ב) בסעיפים (1,2,3) להלן רישמו את זמן-הריצה הכולל שדורש תור-הקדימויות במסגרת הרצת האלגוריתם של Dijkstra או של Prim. ציינו בנפרד את התרומה של כל סוג פעולה, ולא רק את הסכום הסופי. דוגמא לפורמט תשובה של תקין: (3 נק׳).
בסעיפים (4,5) נעדיף מימוש מסוים (על פני מימוש אחר) אם זמן-הריצה האסימפטוטי שלו קטן יותר. (למשל, זמן עדיף על זמן .) "צפיפות" של גרף פרושה, הקשר האסימפטוטי בין מספר הקדקודים לבין מספר הצלעות (למשל, ).
בבקשה לא לכתוב נימוקים בסעיפים (1-5), מעבר למה שצוין לעיל.
(1) הזמן בערימת-פיבונאצ'י____________________________________________(1 נק׳)
(2) הזמן בערימה-בינארית_____________________________________________(1 נק׳)
(3) הזמן ברשימה ___________________________________________________(4 נק׳)
(4) באילו צפיפויות נעדיף רשימה על פני ערימה-בינארית________________________(6 נק׳)
(5) באילו צפיפויות נעדיף ערימת-פיבונאצ'י על פני רשימה_______________________(6 נק׳)
השאלה דנה במימושים שונים לתור-קדימויות עם מפתחות, במסגרת הפעלת האלגוריתם של Dijkstra או של Prim. מימוש פשוט במיוחד הוא לשמור את כל המפתחות ברשימה דו-כיוונית ללא שום דרישת-סדר (להלן "רשימה". בפרט, הרשימה אינה ממוינת). ערימת-פיבונאצ'י הינה מימוש מחוכם, שאינו נלמד בקורס, אך זמני-הריצה שלו רשומים להלן (למען הדיוק, רשומים מעין זמני-ריצה "ממוצעים", אך ניתן להוכיח כי לעובדה זו אין השפעה על זמן-הריצה הכולל של האלגוריתמים, ולכן יש להתעלם מאבחנה זו). לכל אורך התשובה יש להשמיט את הסימנים האסימפטוטיים .
(א) השלימו בטבלה הבאה את זמני-הריצה עבור כל סוג של פעולה.
| רשימה | ערימה-בינארית | ערימת-פיבונאצ'י | |
|---|---|---|---|
| בניית התור | |||
| שליפת מינימום | (5 נק׳) | ||
| הקטנת מפתח | (1 נק׳) | (9 נק׳) |
בסעיפים (4,5) נעדיף מימוש מסוים (על פני מימוש אחר) אם זמן-הריצה האסימפטוטי שלו קטן יותר. (למשל, זמן עדיף על זמן .) "צפיפות" של גרף פרושה, הקשר האסימפטוטי בין מספר הקדקודים לבין מספר הצלעות (למשל, ).
בבקשה לא לכתוב נימוקים בסעיפים (1-5), מעבר למה שצוין לעיל.
(1) הזמן בערימת-פיבונאצ'י____________________________________________(1 נק׳)
(2) הזמן בערימה-בינארית_____________________________________________(1 נק׳)
(3) הזמן ברשימה ___________________________________________________(4 נק׳)
(4) באילו צפיפויות נעדיף רשימה על פני ערימה-בינארית________________________(6 נק׳)
(5) באילו צפיפויות נעדיף ערימת-פיבונאצ'י על פני רשימה_______________________(6 נק׳)
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 772021סמסטר א
★★★★★
סיבוכיותניתוח אלגוריתמיםאלגוריתמים חמדנייםגרפיםמסלולים קצריםדייקסטרהעץ פורש מינימליפרים
יש לנתח את מספר הפעולות מכל סוג (בנייה, שליפת מינימום, הקטנת מפתח) שאלגוריתם דייקסטרה או פרים מבצע. לאחר מכן, יש להכפיל את סיבוכיות הפעולה המתאימה במספר הפעמים שהיא מתבצעת, עבור כל אחד מהמימושים של תור הקדימויות.
סעיף א'
נשלים את זמני הריצה החסרים בטבלה. הסיבוכיות היא עבור תור קדימויות המכיל עד איברים, כפי שקורה באלגוריתמים של דייקסטרה ופרים.* רשימה, שליפת מינימום: כדי למצוא את האיבר עם הערך המינימלי ברשימה לא ממוינת, יש לעבור על כל איברי הרשימה. לכן, הסיבוכיות היא .
* רשימה, הקטנת מפתח: בהינתן מצביע לצומת ברשימה, פעולת עדכון הערך היא מיידית. לכן, הסיבוכיות היא .
* ערימה-בינארית, הקטנת מפתח: לאחר הקטנת הערך של מפתח, יש צורך "לבעבע" אותו כלפי מעלה בערימה כדי לשמור על תכונת הערימה. במקרה הגרוע, פעולה זו לוקחת זמן הפרופורציונלי לגובה הערימה. לכן, הסיבוכיות היא .
הטבלה המלאה:
| רשימה | ערימה-בינארית | ערימת-פיבונאצ'י | |
|---|---|---|---|
| בניית התור | |||
| שליפת מינימום | |||
| הקטנת מפתח |
סעיף ב'
באלגוריתמים של דייקסטרה ופרים, מבצעים את הפעולות הבאות על תור הקדימויות:* בניית התור: פעולה אחת, המכניסה את כל הצמתים.
* שליפת מינימום (Extract-Min): מתבצעת פעמים, פעם אחת עבור כל צומת.
* הקטנת מפתח (Decrease-Key): מתבצעת לכל היותר פעם אחת עבור כל קשת, כלומר פעמים במקרה הגרוע.
חישוב זמן הריצה הכולל לכל מימוש:
(1) ערימת-פיבונאצ'י: זמן הריצה הכולל הוא סכום זמני הפעולות: (בנייה) (שליפות מינימום) (הקטנות מפתח).
סה"כ: .
(2) ערימה-בינארית: זמן הריצה הכולל הוא: (בנייה) (שליפות מינימום) (הקטנות מפתח).
סה"כ: (בהנחה שהגרף קשיר, ).
(3) רשימה: זמן הריצה הכולל הוא: (בנייה) (שליפות מינימום) (הקטנות מפתח).
סה"כ: (כיוון ש-).
(4) השוואה: רשימה מול ערימה-בינארית:
נעדיף מימוש רשימה () על פני ערימה-בינארית () כאשר זמן הריצה של הרשימה קטן או שווה אסימפטוטית, כלומר כאשר .
אי-שוויון זה מתקיים כאשר עבור קבוע , או .
לכן, נעדיף רשימה עבור גרפים צפופים מאוד, המקיימים .
(5) השוואה: ערימת-פיבונאצ'י מול רשימה:
נעדיף ערימת-פיבונאצ'י () על פני רשימה () כאשר זמן הריצה שלה קטן יותר אסימפטוטית, כלומר כאשר .
מכיוון ש-, התנאי שקול ל-.
לכן, נעדיף ערימת-פיבונאצ'י עבור כל הגרפים שאינם צפופים לחלוטין (כלומר, כאשר אינו ). התשובה היא .