מבני נתונים ואלגוריתמים - מחברת קורס/מבחן סופי מועד א' סמסטר קיץ 2007 - שאלות
מתוך ויקיספר, אוסף ספרי הלימוד והמדריכים החופשי.
|
הנחיות
|
תוכן עניינים |
[עריכה] שאלה 1
(~12 נקודות)
ליריד התעסוקה של האוניברסיטה הגיעו
סטודנטים,
, ו
חברות,
. נניח שכל סטודנט מוכן לעבוד בחברה אחת או יותר, וכל חברה מוכנה להעסיק סטודנט אחד או יותר, אך כל סטודנט יכול לעבוד בחברה אחת לכל היותר, וכל חברה יכולה להעסיק מספר ידוע של סטודנטים, שהוא לפחות 1.
נתון מערך רצון התעסוקה W, שבו
זוגות. אם הזוג (i, j) מופיע בW, אז המשמעות היא שסטודנט
מוכן לעבוד בחברה
, וחברה
מוכנה להעסיק את סטודנט
. כמו כן, נתון מערך פוטנציאל ההעסקה P, שבו
מספרים שלמים. P[j] מתאר את מספר המשרות הפנויות בחברה
.
רוצים למצוא את השמת הסטודנטים לחברות כך שמספר רב ככל האפשר של סטודנטים יעבדו. אנא הסבר כיצד לכתוב אלגוריתם יעיל המקבל את המערך
, ומוציא מערך גדול ככל האפשר W', כך שיתקיימו התנאים הבאים:
- אם הזוג
(i, j)מופיע בW', אז הוא גם מופיע בW. - אם הזוג
(i, j)מופיע בW', אז אין זוג אחר בW'שאברו הראשון
. - מספר הזוגות מהצורה
(i, j)בW'בעלי אותו
, הוא לכל היותר
.
[עריכה] שאלה 2
(~33 נקודות)
מעל הירקון עומד גשר שאורכו
מטרים (
מספר שלם חיובי גדול מ1 כלשהו). הגשר נמצא לא תקין אפילו בסטנדרטים של מדינת ישראל(!). יש לפרק את הגשר לחלקים ולפנותו בצורה הזולה ביותר. ראשית צריך לשבור את הגשר. ניתן לשבור את הגשר למספר חלקים. שבירת הגשר חייבת להתבצע בנקודות
בלבד. שבירת כל נקודה עולה
שקלים (
מספר שלם חיובי כלשהו).
|
דוגמה: נניח
|
כעת יש להוביל את חלקי הגשר. הנח שקיימת פונקציה
ידועה כך ש
מתארת את עלות הובלתו של חלק בעל אורך i. הנח ש
הוא מספר שלם חיובי לכל
.
|
שימו לב: וודא שאינך מניח במובלע דברים שלא נאמרו לגבי |
|
דוגמה: בהמשך לדוגמה הקודמת שראינו, נניח
|
אנא מצא אלגוריתם יעיל למציאת נקודות השבירה כך שסך העלויות (שבירה והובלה) נמוך ככל האפשר. כלומר, אנא כתוב אלגוריתם יעיל שימצא את העלות המינימלית וכן ידפיס את נקודות השבירה של עלות זו.
[עריכה] שאלה 3
(~33 נקודות)
נתונה רשת כבישי אגרה. לכל כביש יש מספר המתאר את עלות הנסיעה בכביש.
|
דוגמה: בתרשים הבא, עלות הנסיעה בכביש מ1 ל2 היא |
חברת "קדמה לתורה" פתחה כביש אגרה חדש. כדי למשוך לקוחות פוטנציאליים, למשך החודש הקרוב, תשלם החברה לכל מי שיסע בכביש. נניח לכן שעלות הנסיעה בכביש זה שלילית.
|
דוגמה: בתרשים הקודם, עלות הנסיעה בכביש מ7 ל3 היא |
|
שימו לב: בתרגום לגרפים, מדובר בגרף מכוון וטבלת עלויות לקשתות, כך שיש בדיוק עלות שלילית אחת. הנח שאין מעגלים שליליים בגרף. |
אנא מצא אלגוריתם יעיל המקבל את הגרף, טבלת עלויות לקשתות, וצומת מוצא
, ומחזיר, עבור כל צומת
, את עלות המסלול הזול ביותר מ
ל
.
|
דוגמה: בתרשים הקודם, נניח שצומת המוצא הוא
|
[עריכה] שאלה 4
(~28 נקודות)
הסטודנט העיראקי איפ חמיס תברא מתבונן בקטע הקוד הבא:
# Makes a binary heap from an array (Values). Build-Heap(Values) 1 bh = Make-Priority-Queue() 2 bh.size = Length(Values) 3 for i in [1, ..., Length(Values)] 4 bh.Values[i] = Values[i] 5 Arrange(bh) 6 return bh
קטע קוד זה מקבל מערך, ומחזיר ערימה בינרית . איפ חוכך בדעתו כיצד מומשה הפונקציה Arrange. (אנו למעשה כבר ראינו את המימוש הבא:
Arrange(bh) 1 for i in [Length(bh.Values), ..., 1] 2 Bubble-Down(bh, i)
אך הוא אינו יודע זאת).
מספר אפשרויות עולות על דעתו:
Arrange(bh) 1 for i in [⌊Length(bh.Values) / 2⌋, ..., 1] 2 Bubble-Down(bh, i)
Arrange(bh) 1 Merge-Sort(bh.Values)
Arrange(bh) 1 for i in [1, ..., Length(bh.Values)] 2 Bubble-Down(bh, i)
Arrange(bh) 1 for i in [1, ..., Length(bh.Values)] 2 Bubble-Up(bh, i)
Arrange(bh) 1 for i in [Length(bh.Values), ..., 1] 2 Bubble-Up(bh, i)
עבור כל אחת מהאפשרויות, אנא הוכח או הפרך את הטענה שבהכרח תתקבל ערימה תקנית, ונתח את הסיבוכיות במקרה הגרוע (בלי קשר לשאלה האם תתקבל ערימה תקנית).
ו
(ראה A בתרשים הבא). אפשר לשבור את הגשר ב4 אפנים:
.
.
.
,
, ו
. ארבע האפשרויות שראינו מקודם יעלו כך:
.
.
.
.
.
:
, ועלותו 2.
, ועלותו 3.