שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2024 - ערימות
שאלה 1
1. (12 נקודות) נתון מערך בגודל המכיל ערימת מקסימום בגודל לא ידוע. כלומר, התאים הראשונים של המערך הם ערימה תקנית ושאר התאים מכילים את הערך אינסוף (וכאמור, אינו ידוע). עליכם לקבוע את ערכו של בזמן לוגריתמי ב־. כלומר, אם וגודל הערימה הסתבר להיות 30 אזי יש לבצע כ־5 פעולות ולא כ־100 פעולות.
2. (13 נקודות) נתונה ערימת מינימום שבה בכל רמה כל האיברים זהים. לדוגמה, הערימה .
כתבו שגרה בפסאדו־קוד המקבלת כקלט ערימה כנ״ל ואיבר נוסף ומחזירה אינדקס של מופע כלשהו של בערימה או אם הוא לא קיים. זמן הריצה צריך להיות כאשר הוא מספר האיברים בערימה.
1. (12 נקודות) נתון מערך בגודל המכיל ערימת מקסימום בגודל לא ידוע. כלומר, התאים הראשונים של המערך הם ערימה תקנית ושאר התאים מכילים את הערך אינסוף (וכאמור, אינו ידוע). עליכם לקבוע את ערכו של בזמן לוגריתמי ב־. כלומר, אם וגודל הערימה הסתבר להיות 30 אזי יש לבצע כ־5 פעולות ולא כ־100 פעולות.
2. (13 נקודות) נתונה ערימת מינימום שבה בכל רמה כל האיברים זהים. לדוגמה, הערימה .
כתבו שגרה בפסאדו־קוד המקבלת כקלט ערימה כנ״ל ואיבר נוסף ומחזירה אינדקס של מופע כלשהו של בערימה או אם הוא לא קיים. זמן הריצה צריך להיות כאשר הוא מספר האיברים בערימה.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ג2024סמסטר ב
★★★★★
ערימותסיבוכיות זמןחיפושחיפוש בינארי
סיבוכיות הזמן מרמזת שלא ניתן לסרוק את כל המערך. יש למצוא תחילה חסם עליון יעיל ל- באמצעות בדיקת אינדקסים במרווחים מעריכיים, ורק אז לבצע חיפוש מדויק בטווח המצומצם שיימצא.
האלגוריתם מורכב משני שלבים, ומטרתו למצוא את גודל הערימה בסיבוכיות זמן .
1. מציאת תחום חיפוש באמצעות הכפלה מעריכית (Exponential Search):
מכיוון ש- אינו ידוע, איננו יכולים לבצע חיפוש בינארי ישירות על כל המערך, שכן הדבר יוביל לסיבוכיות של . במקום זאת, נמצא תחילה תחום שבו חייב להימצא. נבדוק אינדקסים שהם חזקות של 2: . נמשיך להכפיל את האינדקס הנבדק כל עוד הערך באינדקס זה אינו אינסוף, וכל עוד לא חרגנו מגבולות המערך. נעצור באינדקס הראשון שבו הוא אינסוף (או ש-). בשלב זה, אנו יודעים שהאינדקס האחרון של הערימה נמצא בתחום . שלב זה לוקח פעולות, מכיוון שאנו מגיעים לגודל מסדר גודל של תוך הכפלות.
2. חיפוש בינארי בתחום המצומצם:
כעת, לאחר שזיהינו תחום חיפוש שגודלו , נבצע חיפוש בינארי בתוך התחום הזה. מטרת החיפוש היא למצוא את האינדקס האחרון שעבורו אינו אינסוף. האינדקס הבא, , יהיה הראשון שיכיל אינסוף (או יהיה מחוץ לתחום הערימה). לכן, גודל הערימה הוא . מכיוון שגודל התחום הוא , החיפוש הבינארי ייקח זמן.
הסיבוכיות הכוללת של האלגוריתם היא סכום זמני הריצה של שני השלבים: , כנדרש.
1. מציאת תחום חיפוש באמצעות הכפלה מעריכית (Exponential Search):
מכיוון ש- אינו ידוע, איננו יכולים לבצע חיפוש בינארי ישירות על כל המערך, שכן הדבר יוביל לסיבוכיות של . במקום זאת, נמצא תחילה תחום שבו חייב להימצא. נבדוק אינדקסים שהם חזקות של 2: . נמשיך להכפיל את האינדקס הנבדק כל עוד הערך באינדקס זה אינו אינסוף, וכל עוד לא חרגנו מגבולות המערך. נעצור באינדקס הראשון שבו הוא אינסוף (או ש-). בשלב זה, אנו יודעים שהאינדקס האחרון של הערימה נמצא בתחום . שלב זה לוקח פעולות, מכיוון שאנו מגיעים לגודל מסדר גודל של תוך הכפלות.
2. חיפוש בינארי בתחום המצומצם:
כעת, לאחר שזיהינו תחום חיפוש שגודלו , נבצע חיפוש בינארי בתוך התחום הזה. מטרת החיפוש היא למצוא את האינדקס האחרון שעבורו אינו אינסוף. האינדקס הבא, , יהיה הראשון שיכיל אינסוף (או יהיה מחוץ לתחום הערימה). לכן, גודל הערימה הוא . מכיוון שגודל התחום הוא , החיפוש הבינארי ייקח זמן.
הסיבוכיות הכוללת של האלגוריתם היא סכום זמני הריצה של שני השלבים: , כנדרש.