שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2018 - ערימות
רצונו להדוץ אט איברים הרדולעים בידיחור קבוצה של איברים המאופיינות בעיות אמרת. הראה/י אך לא קיים חסם תחתון של 1.0 לכמה, בעירומת מסיסימון. הערה/י אז לזוגיא . השמוש/מספר עיבודת עור.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2018סמסטר ב
★★★★★
ערימותערימה בינאריתסיבוכיות זמןתור עדיפויות
ניתן לפתור את הבעיה בסריקה אחת של המערך, תוך שימוש במבנה נתונים עזר השומר בכל רגע את האיברים הקטנים ביותר שנצפו עד כה.
השאלה, על אף הניסוח המשובש, עוסקת ככל הנראה במציאת האיברים הקטנים ביותר מתוך קבוצה של איברים. נציג אלגוריתם יעיל לפתרון בעיה זו באמצעות ערימת מקסימום (Max-Heap).
הרעיון המרכזי הוא לתחזק מבנה נתונים, במקרה זה ערימת מקסימום, בגודל , אשר תכיל בכל רגע נתון את האיברים הקטנים ביותר שפגשנו עד כה במהלך סריקת המערך. האיבר בראש ערימת המקסימום הוא הגדול ביותר מבין האיברים הללו. כאשר אנו סורקים איבר חדש מהקלט, נשווה אותו לאיבר שבשורש הערימה. אם האיבר החדש קטן יותר מראש הערימה, הרי שהוא "ראוי" יותר להיכלל בקבוצת האיברים הקטנים ביותר, ולכן הוא יחליף את האיבר הגדול ביותר הנוכחי בקבוצה זו (זה שבשורש).
תיאור האלגוריתם:
1. ניצור ערימת מקסימום ריקה בגודל .
2. נבנה את הערימה מה- האיברים הראשונים של מערך הקלט. פעולה זו, הידועה כ-Build-Heap, מתבצעת בסיבוכיות זמן של .
3. כעת, נעבור על יתר האיברים במערך (החל מהאיבר באינדקס ). עבור כל איבר :
א. נשווה את עם האיבר הנמצא בשורש הערימה, .
ב. אם :
i. נחליף את ערך השורש בערך של .
ii. נבצע פעולת Max-Heapify על השורש כדי לשמר את תכונת ערימת המקסימום. פעולה זו מבטיחה שהאיבר הגדול ביותר "יצוף" בחזרה למעלה. סיבוכיות פעולה זו היא , כתלות בגובה הערימה.
4. לאחר סיום המעבר על כל איברי הקלט, הערימה מכילה את האיברים הקטנים ביותר מתוך הקבוצה כולה.
ניתוח סיבוכיות זמן:
- שלב 2, בניית הערימה הראשונית, לוקח זמן.
- שלב 3, המעבר על יתרת האיברים, כולל לולאה שרצה פעמים. בכל איטרציה, במקרה הגרוע ביותר (כאשר האיבר הנבדק קטן מראש הערימה), אנו מבצעים פעולת Heapify שעלותה . לכן, העלות הכוללת של שלב זה היא .
- סיבוכיות הזמן הכוללת של האלגוריתם היא הסכום של שני השלבים: .
אלגוריתם זה יעיל במיוחד כאשר קטן משמעותית מ- (), אז הסיבוכיות קרובה ל-, שהוא שיפור ניכר על פני מיון מלא של המערך ב-. בסיום פעולת האלגוריתם, האיברים בערימה אינם ממוינים. אם נדרש גם למיין אותם, ניתן להוציא את כולם מהערימה (תוך תיקון חוזר של הערימה), בעלות נוספת של .
lacksquare
הרעיון המרכזי הוא לתחזק מבנה נתונים, במקרה זה ערימת מקסימום, בגודל , אשר תכיל בכל רגע נתון את האיברים הקטנים ביותר שפגשנו עד כה במהלך סריקת המערך. האיבר בראש ערימת המקסימום הוא הגדול ביותר מבין האיברים הללו. כאשר אנו סורקים איבר חדש מהקלט, נשווה אותו לאיבר שבשורש הערימה. אם האיבר החדש קטן יותר מראש הערימה, הרי שהוא "ראוי" יותר להיכלל בקבוצת האיברים הקטנים ביותר, ולכן הוא יחליף את האיבר הגדול ביותר הנוכחי בקבוצה זו (זה שבשורש).
תיאור האלגוריתם:
1. ניצור ערימת מקסימום ריקה בגודל .
2. נבנה את הערימה מה- האיברים הראשונים של מערך הקלט. פעולה זו, הידועה כ-Build-Heap, מתבצעת בסיבוכיות זמן של .
3. כעת, נעבור על יתר האיברים במערך (החל מהאיבר באינדקס ). עבור כל איבר :
א. נשווה את עם האיבר הנמצא בשורש הערימה, .
ב. אם :
i. נחליף את ערך השורש בערך של .
ii. נבצע פעולת Max-Heapify על השורש כדי לשמר את תכונת ערימת המקסימום. פעולה זו מבטיחה שהאיבר הגדול ביותר "יצוף" בחזרה למעלה. סיבוכיות פעולה זו היא , כתלות בגובה הערימה.
4. לאחר סיום המעבר על כל איברי הקלט, הערימה מכילה את האיברים הקטנים ביותר מתוך הקבוצה כולה.
ניתוח סיבוכיות זמן:
- שלב 2, בניית הערימה הראשונית, לוקח זמן.
- שלב 3, המעבר על יתרת האיברים, כולל לולאה שרצה פעמים. בכל איטרציה, במקרה הגרוע ביותר (כאשר האיבר הנבדק קטן מראש הערימה), אנו מבצעים פעולת Heapify שעלותה . לכן, העלות הכוללת של שלב זה היא .
- סיבוכיות הזמן הכוללת של האלגוריתם היא הסכום של שני השלבים: .
אלגוריתם זה יעיל במיוחד כאשר קטן משמעותית מ- (), אז הסיבוכיות קרובה ל-, שהוא שיפור ניכר על פני מיון מלא של המערך ב-. בסיום פעולת האלגוריתם, האיברים בערימה אינם ממוינים. אם נדרש גם למיין אותם, ניתן להוציא את כולם מהערימה (תוך תיקון חוזר של הערימה), בעלות נוספת של .
lacksquare