מבני נתונים

‫מבני נתונים‬
‫‪0571.1818‬‬
‫בהצלחה‪,‬‬
‫ועד הנדסה‬
‫הפקולטה להנדסה‬
‫המחלקה להנדסת תעשייה‬
‫סמסטר ב' תשע"ד‬
‫בחינת מעבר מועד א' ‪47.7.9‬‬
‫משך הבחינה‪ 3 :‬שעות‬
‫ת‪7‬ז‪_______________ 7‬‬
‫מבחן בקורס "מבני נתונים"‬
‫‪17..-.1.1‬‬
‫מרצה‪ :‬רעות נוחם‬
‫מתרגל‪ :‬שחר וינשטוק‬
‫‪-‬‬
‫חומר עזר‪ 2 :‬דפים כתובים ומחשבון‪7‬‬
‫‪-‬‬
‫נא להקפיד על כתב יד ברור‬
‫‪-‬‬
‫נא להקפיד על תשובות קצרות ובהירות (יתכן מצב שבו המוסיף גורע)‬
‫‪-‬‬
‫במהלך הבחינה יענו שאלות הבהרה המתייחסות לטופס הבחינה בלבד‬
‫‪-‬‬
‫יש לענות על כל השאלות ‪.-9‬‬
‫‪-‬‬
‫אסורה אחזקת טלפונים סלולאריים‪ ,‬וכל מכשיר אלקטרוני אחר בקרבת מקום‪7‬‬
‫בהצלחה‬
‫כל הזכויות שמורות ©‬
‫מבלי לפגוע באמור לעיל‪ ,‬אין להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לשדר‪ ,‬לאחסן מאגר מידע‪ ,‬בכל דרך שהיא‪ ,‬בין‬
‫מכנית ובין אלקטרונית או בכל דרך אחרת כל חלק שהוא מטופס הבחינה‪.‬‬
‫עמוד ‪ 1‬מתוך ‪9‬‬
‫שאלה ‪ 02( 1‬נקודות)‬
‫ענה נכון‪/‬לא נכון לגבי כל אחד מהמשפטים הבאים‪ ,‬והסבר ב‪ 3 -‬שורות לכל היותר את תשובתך‪ 7‬נקודה תינתן עבור‬
‫תשובה נכונה ועוד שלוש נקודות עבור הסבר מלא‪ 7‬תשובה לא נכונה עשויה לזכות בניקוד חלקי אם ההסבר מעיד על‬
‫הבנת הנקודה‪ 7‬אם לדעתך המשפט נכון רק במקרים מסוימים‪ ,‬פרט באילו מקרים‪ 7‬יש לענות על שאלה זו בטופס‬
‫הבחינה‪ ,‬במקום המיועד‪.‬‬
‫א‪ 7‬בערימת מינימום‪ ,‬ניתן למצוא את החציון בסיבוכיות‬
‫לא נכון ‪ 7‬החציון לא נמצא במקום ספציפי בערימה ולכן כדי למצוא אותו יש לעבור על כל הערכים בערימה‬
‫ולהשוות ביניהם‪7‬‬
‫ב‪ 7‬נתונה נוסחת הנסיגה הבאה‪:‬‬
‫) (‬
‫‪ ,‬אזי‬
‫נכון‪ 7‬לפי החלק השלישי של משפט המאסטר‪ -‬שני התנאים מתקיימים‪7‬‬
‫ג‪7‬‬
‫נתונה טבלת ‪:hash‬‬
‫‪.‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪9‬‬
‫‪7‬‬
‫‪6‬‬
‫‪43‬‬
‫‪97‬‬
‫‪74‬‬
‫‪34‬‬
‫‪7.‬‬
‫אם פונקציית ה‪ hash-‬המשמשת להכנסת האיברים היא ‪ h(x)=x mod 7‬והטיפול בהתנגשויות מתבצע בשיטת ה‪-‬‬
‫‪ linear probing‬אזי ‪ 74‬הוכנס לטבלה אחרי ‪ 97‬ולפני ‪ 34‬בוודאות‪( 7‬ניתן להניח כי לא בוצעו מחיקות של ערכים‬
‫מהטבלה)‬
‫נכון‪ 34 7‬צריך היה להיכנס לתא ‪ ,4‬מכיוון שהוא בתא ‪ 74 ,7‬נכנס לפניו‪ 74 7‬צריך היה להיכנס לתא ‪ ,3‬מכיוון שהוא‬
‫בתא ‪ 9‬אזי ש‪ 97-‬מוקם לפניו בתא ‪73‬‬
‫ד‪ 7‬ניתן למיין ‪ K‬מספרים בזמן‬
‫ע"י הכנסתם לעץ חיפוש בינארי וביצוע סריקת ‪ inorder‬שמחזירה אותם‬
‫ממוינים‬
‫לא נכון‪ .‬הכנסה לעץ חיפוש בינארי לא מאוזן יכולה להתבצע במקרה הגרוע בסיבוכיות של‬
‫לעשות‬
‫הכנסות כאלו‪ ,‬במקרה הגרוע נקבל‬
‫‪ 7‬מכיוון שיש‬
‫‪ 7‬לכן רק בהכנסות (עדיין לפני הסריקה)‬
‫הסיבוכיות גבוהה יותר‪7‬‬
‫ה‪ 7‬אם נמיין את הסדרה ‪ .1,.,2,.7,.4‬באמצעות מיון מיזוג (‪ )merge sort‬ואת הסדרה ‪ 93,3.,21,71,7.‬באמצעות‬
‫מיון ערימה (‪ )heap sort‬אז זמן הריצה בפועל יהיה זהה‬
‫לא נכון‪ .‬אמנם שני המיונים הללו מבוססי השוואות ולכן אין משמעות לערך המפתחות אלא רק ליחסים ביניהם‪,‬‬
‫ושתי הסדרות לעיל מקיימות את אותו סדר היחס בין כל המפתחות אבל מכיוון שאלו מיונים שונים מס'‬
‫הפעולות בפועל יהיה שונה‪ 7‬אם הינו מריצים את שני הקלטים הללו באותו מיון אז זמן הריצה היה זהה‪7‬‬
‫עמוד ‪ 2‬מתוך ‪9‬‬
‫שאלה ‪ 02( 0‬נקודות)‬
‫פיפ"א מעוניינת לנהל מידע אודות הנבחרות המשתתפות במונדיאל ‪ 721.9‬לכל נבחרת יש להחזיק מבנה נתונים נפרד‬
‫(אך זהה לכל הנבחרות) המכיל את הנתונים אודות שחקני הנבחרת‪ ,‬הניחו כי בכל נבחרת סדר גודל של ‪ n‬שחקנים‪ 7‬לכל‬
‫שחקן תיפתח רשומה הכוללת את השדות הבאים‪ :‬שם השחקן‪ ,‬מספר השחקן‪ ,‬מס' הגולים שהבקיע במהלך הטורניר‪,‬‬
‫מס' הדקות ששיחק במצטבר ומס' עבירות‪ 7‬על מבנה הנתונים לאחסן שדות מהצורה ‪(Name, number, goals,‬‬
‫)‪ total_time, fouls‬ולתמוך בפעולות הבאות‪:‬‬
‫תיאור‬
‫פעולה‬
‫)‪Insert_player (Name, number, goals, total_time, fouls‬‬
‫סיבוכיות‬
‫נדרשת‬
‫הכנסת שחקן חדש‪ 7‬שחקן יכנס למבנה‬
‫)‪O(log n‬‬
‫הנתונים לראשונה רק כאשר הוא משחק‬
‫בפועל‪ ,‬אין הוצאה של שחקן‪7‬‬
‫‪Update_player (Name, number, add_goals, add_time,‬‬
‫)‪add_fouls‬‬
‫עדכון נתוני שחקן‪7‬‬
‫)‪O(log n‬‬
‫לדוגמה הפעולה‪:‬‬
‫)‪Update_player (Name,.1,2 , 67, 1‬‬
‫תוסיף לשחקן ‪ Name‬שמספרו ‪ ,.1‬שני‬
‫גולים‪ 67 ,‬דקות משחק ו‪ 1-‬עבירות‬
‫)( ‪Top_Scorer‬‬
‫החזרת מלך השערים של הנבחרת‬
‫)‪O(1‬‬
‫להלן דוגמה לשמות שחקני נבחרות‬
‫יוון‪ :‬דימיטריס סלפינגידיס‪ ,‬דימיטריס פאפאדופולוס‪ ,‬אברם פאפאדופולוס‪ ,‬סוקראטיס פאפסטאטופולוס‬
‫רוסיה‪ -‬ואסילי ברזוצקי‪ ,‬אלכסיי ברזוצקי‪ ,‬אלכסיי יונוב‪7‬‬
‫הולנד‪ -‬ג'ונתן דה גוזמן‪ ,‬נייג'ל דה יונג‪ ,‬סטפן דה פריי‪7‬‬
‫א‪ 7‬מבנה נתונים מבוסס ‪ Hash-Table‬בשיטת השרשור‪ ,‬עם שמות השחקנים כמפתחות יכול להיות בעייתי במימוש‬
‫מכיוון ש‪( :‬הקיפו את התשובה הנכונה) (‪ 9‬נק')‬
‫‪ ).‬התפלגות המפתחות (הפיזור שלהן) ב‪ Hash-Table-‬של כל נבחרת כנראה לא תהיה אחידה‬
‫‪)2‬‬
‫בחלק מהנבחרות ישנם שמות ארוכים מידי מכדי להכניס אותם ל‪Hash-Table-‬‬
‫‪)3‬‬
‫שני שחקנים עם שם פרטי או שם משפחה דומה ישורשרו בוודאות לאותו התא ב‪Hash-Table-‬‬
‫‪)9‬‬
‫לרוב התאים בטבלה יגובבו הרבה שחקנים‬
‫ב‪ 7‬הציעו מבנה הנתונים יעיל‪ ,‬העומד בדרישות הסיבוכיות לניהול המידע‪ 7( 7‬נק')‬
‫ג‪7‬‬
‫עבור כל אחת מהפעולות תארו כיצד היא תתבצע (תיאור רעיון כללי‪ ,‬אין צורך בפסאודו‪-‬קוד) והראו כי היא‬
‫עומדת בסיבוכיות הנדרשת‪ .1( .‬נק')‬
‫ד‪ 7‬פיפ"א מבקשת את היכולת להפיק את רשימת ‪ k‬המבקיעים המצטיינים של הטורניר עד כה בסיבוכיות‬
‫(הניחו ‪ 7)k<n‬הסבירו כיצד ניתן לעשות זאת מבלי לפגוע בסיבוכיות של הפעולות שתיארתם בסעיף ג'‪ 6( 7‬נק')‬
‫עמוד ‪ 3‬מתוך ‪9‬‬
‫א‪ 7‬התשובה היא ‪ 7.‬הסבר‪ Hash-Table :‬מניח התפלגות אחידה של המפתחות‪ 7‬מכיוון שהשמות של שחקני‬
‫כל נבחרת דומים זה לזה‪ ,‬קשה ליצור ‪ Hash-Table‬אחיד לכל הנבחרות שבו המפתחות יתפלגו בצורה‬
‫אחידה‪ 7‬התוצאה תהיה כניסה של הרבה מפתחות לאותו התא והסתברות גבוהה יותר לקבלת סיבוכיות‬
‫על כל פעולה‪7‬‬
‫ב‪ 7‬ניתן להשתמש בעץ אדום שחור‪ -‬פעולת הכנסה ועדכון תיעשה ב‪-‬‬
‫‪ ,‬כדי למצוא את מלך‬
‫השערים נשמור משתנה נוסף שיחזיק את השם של מלך השערים הנוכחי ומס' השערים שלו‪ 7‬בכל עדכון‬
‫מספר שערים של שחקן מסויים‪ ,‬נשווה אותו למלך השערים ובמידת הצורך נעדכן‪ 7‬הדבר אפשרי מכיוון‬
‫שאין מחיקת שחקנים או שערים ולכן עדכון של מלך השערים יעשה רק בהכנסת שחקן חדש או בעדכון‬
‫מס' שערים של שחקן‪ 7‬אפשרות נוספת היא להחזיק ערימת מקסימום‪ ,‬עם מספר השערים כמפתחות‪,‬‬
‫בנפרד לעץ אדום שחור ולחבר במצביעים בין כל שחקן בעץ אדום שחור למס' השערים שלו בערימה‪7‬‬
‫(רעיון נכון אך יותר בזבזני מבחינת זכרון)‬
‫ג‪ 7‬הכנסת שחקן חדש‪ -‬פעולת ‪ insert‬רגילה בעץ אדום שחור‪ ,‬המפתחות יהיו מספרי השחקן (זה מפתח‬
‫ייחודי כיוון שקיים עץ נפרד לכל נבחרת)‪ 7‬כמו כן נשווה את מס' הגולים של השחקן למשתנה מלך‬
‫השערים ונעדכן אותו במידת הצורך‪7‬‬
‫עדכון נתוני שחקן‪ -‬פעולת ‪ search‬רגילה בעץ אדום שחור‪ ,‬עדכון הפרטים של הרשומה‪ 7‬במקרה של‬
‫שינוי מס' השערים‪ ,‬השוואה עם המשתנה המחזיק את מס' השערים ושם השחקן ובמידת הצורך החלפה‬
‫שלו‪7‬‬
‫מלך השערים‪ -‬החזרה של שם השחקן מרשומת מלך השערים‪7‬‬
‫ד‪ 7‬ניתן להחזיק ערימת מינימום בגודל ‪ ,‬לפי המפתחות של מספר השערים‪ 7‬בכל פעם שמעדכנים מספר‬
‫הבקעות לשחקן מסוים נבדוק תחילה האם הוא נמצא בערימת המינימום (משתנה שיהיה לכל רשומה‪,‬‬
‫כל שחקן בערימה יהיה מקושר במצביע מהעץ שלו)‪ ,‬במידה ולא‪ -‬נשווה את מספר השערים שלו עם ראש‬
‫הערימה ב‪-‬‬
‫ובמידת הצורך נחליף ביניהם ב‪-‬‬
‫מספר השערים שלו בערימה ב‪-‬‬
‫ונוציא אותם‪-‬‬
‫‪ 7‬במידה והוא קיים ברשימה‪ ,‬נעדכן את‬
‫‪ 7‬על מנת להפיק את הרשימה נעבור על כל הרשומות בערימה‬
‫(אין דרישה להחזיר רשימה ממויינת)‪7‬‬
‫עמוד ‪ 4‬מתוך ‪9‬‬
‫שאלה ‪ 08( 3‬נקודות)‬
‫מפעל מעוניין להחליט לגבי מדיניות תחזוקה עבור ‪ n‬חודשים למכונה חדשה שרכש‪ 7‬ההחלטה שיש לקבל היא באלו‬
‫חודשים לבצע תחזוקה למכונה (בכל חודש ניתן לבצע או לא לבצע תחזוקה)‪ 7‬עלות התחזוקה בכל חודש תלויה בשני‬
‫גורמים‪:‬‬
‫‪ ‬החודש בו מבוצעת התחזוקה (בכל חודש תעריף שונה)‪7‬‬
‫‪ ‬הזמן שעבר ממועד התחזוקה האחרונה‪7‬‬
‫נתונה מטריצה ‪ A‬בגודל‬
‫של המטריצה (שורה עמודה )‪ ,‬תופיע‬
‫המכילה את עלויות התחזוקה‪ 7‬באיבר‬
‫עלות התחזוקה בחודש כאשר פעולת התחזוקה הקודמת (האחרונה) בוצעה בחודש ‪( 7‬עבור‬
‫העלות היא‬
‫אינסוף)‪ ,‬הניחו כי בחודש הראשון (חודש ‪ ).‬ובחודש האחרון (חודש ‪ )n‬חייבת להתבצע פעולת תחזוקה ושעלות‬
‫התחזוקה בחודש ‪ .‬היא ‪7c‬‬
‫דוגמה עבור ‪ 9‬חודשים‪:‬‬
‫‪4‬‬
‫∞‬
‫∞‬
‫∞‬
‫∞‬
‫‪2‬‬
‫∞‬
‫∞‬
‫‪120‬‬
‫‪250‬‬
‫‪3‬‬
‫∞‬
‫∞‬
‫∞‬
‫‪130‬‬
‫אם תבוצע תחזוקה בחודשים ‪ .,2,9‬העלות תהיה‪:‬‬
‫‪1‬‬
‫∞‬
‫‪100‬‬
‫‪150‬‬
‫‪300‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫ואם תבוצע תחזוקה בחודשים ‪ .,3,9‬העלות‬
‫תהיה‪:‬‬
‫נסתכל על תת בעיה של הבעיה הגדולה באופן הבא‪:‬‬
‫לכל בין ‪ .‬ל‪ n-‬נגדיר את‬
‫להיות העלות המינימלית לתחזוקה עד לתקופה ‪( ,‬כולל תחזוקה בתקופה )‪7‬‬
‫א‪ 7‬הציגו את נוסחת הרקורסיה המתאימה לבעיה (כלומר כיצד ניתן לעבור מתת בעיה לבעיה גדולה יותר?) התייחסו‬
‫למקרה הבסיס וכתבו תיאור מילולי קצר של הנוסחה‪ 4( 7‬נק')‬
‫ב‪ 7‬ממשו בפסאודו‪-‬קוד או בפייטון פונקציית תכנות דינמי‪:‬‬
‫המוצאת את העלות הזולה ביותר לתחזוקת‬
‫המכונה עבור ‪ n‬תקופות (אין צורך למצוא את התקופות בהן תתבצע תחזוקה אלא רק את העלות) (‪ 1‬נק')‬
‫ג‪7‬‬
‫הראו חסם עליון הדוק ככל האפשר לפונק' שמימשתם בסעיף ב'‪ 7( 7‬נק')‬
‫ד‪ 7‬כיצד תשתנה נוסחת הרקורסיה אם קיימת מגבלה על תחזוקה בשתי תקופות עוקבות כלומר לא ניתן לבצע‬
‫תחזוקה גם בתקופה וגם בתקופה‬
‫? (‪ 6‬נק')‬
‫עמוד ‪ 5‬מתוך ‪9‬‬
‫‪ 7‬נגדיר את‬
‫א‪7‬‬
‫להיות עלות התחזוקה הזולה ביותר של המכונה‬
‫מתקופה ‪ .‬ועד תקופה ‪ ,‬כאשר מבצעים תחזוקה בתקופה ‪ 7‬עבור כל נצטרך למצוא את ה‪ -‬אשר‬
‫מביא לעלות המינימלית הכוללת של התחזוקה כאשר מוגדר להיות התקופה האחרונה שבה ביצענו‬
‫תחזוקה לפני תקופה ‪7‬‬
‫‪,‬‬
‫מקרה בסיס‪-‬‬
‫‪7‬‬
‫נחפש את‬
‫ב‪7‬‬
‫‪# bottom-up solution‬‬
‫)‪cost(A,n‬‬
‫‪# create list‬‬
‫‪M = [0]*n‬‬
‫‪M[0]=C‬‬
‫‪# fill the list‬‬
‫‪for i in range(1, n):‬‬
‫= ‪min‬‬
‫‪for t in range(0, i-1):‬‬
‫‪If M[t]+A[i,t] < min:‬‬
‫]‪min = M[t]+A[i,t‬‬
‫‪M[i] = min‬‬
‫]‪return M[n‬‬
‫ג‪ 7‬האלגוריתם עובר בלולאה על כל הערכים של‬
‫כל הערכים האפשריים של‬
‫סיבוכיות של‬
‫ובתוך הלולאה ישנה לולאה נוספת העוברת על‬
‫‪ 7‬חישוב כל ערך בתוך הלולאה הפנימית הוא‬
‫ולכן נקבל‬
‫‪7‬‬
‫‪ 7‬השינוי היחיד הוא שנגביל את ‪ t‬לרוץ על כל התקופות האפשריות‬
‫ד‪7‬‬
‫פרט לתקופה שלפני ‪( i‬ולכן ירוץ עד‬
‫)‬
‫עמוד ‪ 6‬מתוך ‪9‬‬
‫שאלה ‪ 02( 4‬נקודות)‬
‫לשימושכם‪ ,‬בסוף הטופס נתונים ‪DIJKSTRA,BFS,DFS‬‬
‫א‪ 7‬נתון גרף‬
‫לא מכוון עם משקלים חיוביים על הקשתות‪ ,‬ונתונים צומת‬
‫תארו אלגוריתם (תיאור מילולי בלבד) המוצא מסלול‬
‫מ‪ -‬ל ‪ -‬כך ש‪-‬‬
‫‪7‬‬
‫‪ ,‬ושני צמתים‬
‫הוא מינימלי מבין כל המסלולים‬
‫העוברים בצומת ‪ 7‬מהי סיבוכיות האלגוריתם שהצעתם? (‪ .‬נק')‬
‫ב‪ 7‬נתון גרף‬
‫צמתים‬
‫לא מכוון עם משקלים חיוביים על הקשתות‪ ,‬ונתונה תת קבוצה של צמתים‬
‫‪ 7‬תארו אלגוריתם (תיאור מילולי בלבד) המוצא מסלול‬
‫מ‪ -‬ל‪ -‬כך ש‪-‬‬
‫‪ ,‬ושני‬
‫הוא מינימלי מבין‬
‫כל המסלולים העוברים בצומת אחד לפחות מתוך ‪ 7‬מהי סיבוכיות האלגוריתם שהצעתם? (‪ .1‬נק')‬
‫ג‪7‬‬
‫‪,‬‬
‫עבור גרף קשיר‬
‫| | התקבלו בהרצת ‪ BFS‬ו‪ DFS -‬הפלטים הבאים (יש לקרוא משמאל לימין)‪:‬‬
‫‪BFS: 1,2,3,5,4,6‬‬
‫‪DFS: 1,2,4,3,5,6‬‬
‫סמנו את כל הטענות הנכונות (תיתכן יותר מטענה אחת נכונה)‪ .1(:‬נק')‬
‫‪).‬‬
‫‪ ,‬בוודאות‬
‫‪)2‬‬
‫‪ ,‬בוודאות‬
‫‪ )3‬ייתכן ש‪-‬‬
‫‪ )9‬ייתכן ש‪-‬‬
‫‪)7‬‬
‫‪ ,‬בוודאות‬
‫בהצלחה!!!‬
‫עמוד ‪ 7‬מתוך ‪9‬‬
‫א‪7‬‬
‫נפעיל את האלגוריתם של דייקסטרה עבור צומת התחלה ‪ 7‬האלגוריתם יתן לנו את המסלול הקצר מ‪-‬‬
‫ל‪-‬‬
‫וגם את המסלול הקצר מ‪ -‬ל‪ 7 -‬מכיוון שהגרף לא מכוון‪ ,‬חיבור של שני המסלולים הללו יתן לנו‬
‫חייב להכיל את המסלול הקצר ביותר עד ל‪-‬‬
‫את המסלול המבוקש‪ 7‬המסלול הקצר ביותר שמכיל את‬
‫ומ‪ -‬עד הסוף‪ ,‬אחרת‪ ,‬ניתן להחליף את המסלול בחיבור שני המסלולים הללו שיהיו קצרים בהכרח‪7‬‬
‫| |‬
‫הסיבוכיות היא סיבוכיות אלגוריתם דייקסטרה‪| | :‬‬
‫| |‬
‫‪7‬‬
‫דרך נוספת‪ ,‬נמצא את המסלול הקצר מ ‪ -‬ל ‪ -‬ואת המסלול הקצר מ ‪ -‬ל ‪ -‬בעזרת אלגוריתם‬
‫דייקסטרה ונחבר בין המסלולים הללו‪ 7‬מכיוון שמבצעים רק פעמיים דייקסטרה הסיבוכיות זהה‬
‫והיא | |‬
‫ב‪7‬‬
‫| |‬
‫| |‬
‫‪7‬‬
‫נפעיל פעמיים דייקסטרה‪ :‬פעם אחת עם צומת התחלה‬
‫ופעם שניה עם צומת התחלה ‪ 7‬נעבור על‬
‫התוצאות באופן הבא‪:‬‬
‫נחבר את המסלול הקצר ביותר מצומת‬
‫לצומת כלשהו מהקבוצה‬
‫למסלול הקצר ביותר מצומת‬
‫לצומת זה‪ 7‬כך נבצע עבור כל הקודקודים בקבוצה ‪ 7‬נשמור משתנה מינימום ובכל פעם נשווה את‬
‫התוצאה הנוכחית אליו‪ 7‬המשתנה יחזיק את המסלול עם המשקל הכי נמוך שמצאנו עד כה‪7‬‬
‫סיבוכיות‪ :‬פעמיים דייקסטרה‪ ,‬מעבר על כל המסלולים הקצרים העוברים דרך קודקוד ב‪-‬‬
‫ביניהם‪| | :‬‬
‫| |‬
‫| |‬
‫והשוואה‬
‫| |‬
‫דרך נוספת (פחות יעילה‪ ,‬אך קיבלה את מלוא הניקוד) ‪:‬‬
‫נבחר צומת‬
‫‪ ,‬ונפעיל את האלגוריתם מסעיף א'‪ 7‬לאחר מכן נבחר צומת אחר מ‪ -‬ונחזור על‬
‫הפעולה עד שנעבור על כל הצמתים האפשריים‪ 7‬מכיוון שמבצעים | | פעמים דייקסטרה‪ ,‬הסיבוכיות‬
‫היא‪| | :‬‬
‫ג‪7‬‬
‫| |‬
‫| | | |‬
‫‪7‬‬
‫טענה ‪ .‬נכונה‪ -‬לפי ‪ BFS‬צמתים ‪ .‬ו‪ 2-‬חייבים להיות שכנים (מכיוון שהגרף כולו קשיר)‪7‬‬
‫טענה ‪ 2‬לא נכונה‪ ,‬דוגמה‪:‬‬
‫‪1‬‬
‫‪5‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪6‬‬
‫טענה ‪ 3‬נכונה‪ ,‬אותה דוגמה כמו בטענה ‪72‬‬
‫טענה ‪ 9‬נכונה‪ ,‬דוגמה‪:‬‬
‫‪1‬‬
‫‪5‬‬
‫‪3‬‬
‫‪6‬‬
‫טענה ‪ 7‬לא נכונה‪ ,‬אותן דוגמאות‪7‬‬
‫עמוד ‪ 8‬מתוך ‪9‬‬
‫‪2‬‬
‫‪4‬‬
BFS(G,v)
for every vertex x in V
visited[x]  FALSE
print(v)
visited[v]  TRUE
ENQUEUE(v,Q)
while (not EMPTY(Q))
x  DEQUEUE(Q)
for every neighbor y of x
if (not visited [y])
print(y)
visited[y]  TRUE
ENQUEUE(y,Q)
DFS(G)
for each vertex u do
color[u] white
for each vertex u do
if color[u]= = white
VISIT(u)
VISIT(u)
color[u]gray
print(u)
for each v adj to u do
if color[v]= =white
VISIT(v)
color[u] Black
Dijkstra (G)
for each v V
d[v]
d[s]=0
Q=v
while (
//‫ מכל הקודקודים בגרף‬Q ‫בניית ערימה‬
)
for each v adj to u
if (d[v]>d[u]+w(u,v))
d[v]=d[u]+w(u,v)
9 ‫ מתוך‬9 ‫עמוד‬
‫הפקולטה להנדסה‬
‫המחלקה להנדסת תעשייה‬
‫סמסטר ב' תשע"ב‬
‫בחינת מעבר מועד ב'‬
‫משך הבחינה‪ 3 :‬שעות‬
‫ת‪.‬ז‪_______________ .‬‬
‫מבחן בקורס "מבני נתונים"‬
‫‪1750-0101‬‬
‫מרצה‪ :‬רעות נוחם‬
‫מתרגלת‪ :‬נגה לוי‬
‫‪-‬‬
‫זהו מבחן חסוי‪ .‬אין להעתיק את השאלות למחברת הבחינה‪ ,‬עם סיום הבחינה יש להחזיר את טופס‬
‫הבחינה עם מחברת הבחינה‪.‬‬
‫‪-‬‬
‫חומר עזר‪ 2 :‬דפים כתובים ומחשבון‪.‬‬
‫‪-‬‬
‫נא להקפיד על כתב יד ברור‬
‫‪-‬‬
‫נא להקפיד על תשובות קצרות ובהירות (יתכן מצב שבו המוסיף גורע)‬
‫‪-‬‬
‫במהלך הבחינה יענו שאלות הבהרה המתייחסות לטופס הבחינה בלבד‬
‫‪-‬‬
‫יש לענות על כל השאלות ‪0-4‬‬
‫‪-‬‬
‫אסורה אחזקת טלפונים סלולאריים‪ ,‬וכל מכשיר אלקטרוני אחר בקרבת מקום‪.‬‬
‫בהצלחה‬
‫כל הזכויות שמורות ©‬
‫מבלי לפגוע באמור לעיל‪ ,‬אין להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לשדר‪ ,‬לאחסן מאגר מידע‪ ,‬בכל דרך שהיא‪ ,‬בין‬
‫מכנית ובין אלקטרונית או בכל דרך אחרת כל חלק שהוא מטופס הבחינה‪.‬‬
‫‪1‬‬
‫שאלה ‪ 25( 1‬נקודות)‬
‫ענה נכון‪/‬לא נכון לגבי כל אחד מהמשפטים הבאים‪ ,‬והסבר ב‪ 3 -‬שורות לכל היותר את תשובתך‪ .‬נקודה תינתן עבור‬
‫תשובה נכונה ועוד ארבע נקודות עבור הסבר מלא‪ .‬תשובה לא נכונה עשויה לזכות בניקוד חלקי אם ההסבר מעיד על‬
‫הבנת הנקודה‪ .‬אם לדעתך המשפט נכון רק במקרים מסוימים‪ ,‬פרט באילו מקרים‪ .‬יש לענות על שאלה זו בטופס‬
‫הבחינה‪ ,‬במקום המיועד‪.‬‬
‫א‪ .‬אם נפעיל את אלגוריתם המיון ‪ InsertionSort‬פעם אחת עבור הקלט‪ 05,6,16,47,32 :‬ופעם נוספת עבור הקלט‪:‬‬
‫‪ 5,2,27,01,03‬זמן הריצה בפועל בשני המקרים יהיה זהה‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫ב‪ .‬בכדי למצוא את המסלול הקצר ביותר בגרף ממושקל בו משקלי כל הקשתות זהים אלגוריתם ‪ BFS‬עדיף על‬
‫אלגוריתם ‪Dijkstra‬‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫ג‪.‬‬
‫) (‬
‫נתון‬
‫) (‬
‫אזי )‬
‫) (‬
‫(‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫ד‪ .‬נתונה טבלת ‪:hash‬‬
‫‪9‬‬
‫‪39‬‬
‫‪1‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪3‬‬
‫‪4‬‬
‫‪43‬‬
‫‪77‬‬
‫‪2‬‬
‫‪0‬‬
‫‪1‬‬
‫‪09‬‬
‫אם פונקצית ה‪ hash-‬המשמשת להכנסת האיברים היא ‪ ,h(x)=x mod 10‬הטיפול בהתנגשויות מתבצע בשיטת ה‪-‬‬
‫‪ linear probing‬וידוע כי לא בוצעה אף פעולת מחיקה מהטבלה אז ניתן לומר בודאות כי הערך ‪ 09‬הוכנס לטבלה‬
‫לפני הערך ‪.39‬‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫ה‪ .‬בגרף ממושקל ‪ G‬שיש בו צלע ‪ v‬אשר משקלה גדול ממשקלה של כל צלע אחרת ב‪ ,G-‬מתקיים ש‪ v-‬אינה שייכת‬
‫לעץ המסלולים הקצרים (‪.)SPT=shortest path tree‬‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫_______________________________________________________________________________‬
‫‪2‬‬
‫שאלה ‪ 27( 2‬נקודות)‬
‫א‪.‬‬
‫בנה עץ חיפוש בינארי אשר גובהו קטן שווה ל‪ ,4 -‬מהמפתחות הבאים‪ 7( 11,20,25,50,52,65,71 :‬נק')‬
‫ב‪.‬‬
‫ידוע כי הפלט הבא התקבל משיטוט ב‪ postorder -‬בעץ חיפוש בינארי‪ .‬שחזר את העץ המקורי על סמך הפלט‪:‬‬
‫‪( 0,6,7,1,5,2,01,09,05,07,9‬אם קיימות מס' אפשרויות הצג אחת מהן בלבד) (‪ 6‬נק')‬
‫ג‪.‬‬
‫(סעיף זה אינו תלוי בסעיפים הקודמים) סטודנטים נרשמים לאוניברסיטה ע"י מילוי טפסים מקוונים באינטרנט‪.‬‬
‫ניתן להניח כי מספר הנרשמים מאפשר לאחסן את כל הטפסים בזכרון‪.‬‬
‫‪ )0‬הצע מבנה נתונים שיאפשר למרכז המרשם לטפל בטפסי ההרשמה ע"פ סדר יורד של ציון הסכם‪ ,‬כאשר זמן‬
‫הגישה לטופס של המועמד בעל ציון הסכם הגבוה ביותר הוא )‪ .O(1‬מה יהיה זמן ההכנסה של טופס בקשה‬
‫חדש? מהו זמן מחיקת טופס בקשה שכבר טופל? נמק תשובתך‪ 1( .‬נק')‬
‫‪ )2‬האוניברסיטה החליטה לטפל בנרשמים לפי פקולטה ולתת עדיפות שונה לכל פקולטה‪ .‬סדר העדיפות בתוך כל‬
‫פקולטה נשאר כשהיה (כלומר בסדר יורד ע"פ ציון הסכם)‪ .‬הצע מבנה נתונים שיאפשר למרכז למרשם לגשת‬
‫בזמן )‪ O(1‬אל הטופס הבא בקבוצת הנרשמים למחלקה בעלת העדיפות הגבוהה ביותר‪( .‬הנח כי קבוצת‬
‫המחלקות היא דינאמית כלומר מוציאים ומוסיפים מחלקות לטיפול) (‪ 1‬נק')‬
‫שאלה ‪ 22( 3‬נקודות)‬
‫(הערה‪ :‬סעיפי השאלה אינם תלויים זו בזה)‬
‫א‪ .‬בהינתן סדר הסריקה הבא של ‪ BFS‬על גרף קשיר ‪( G‬משמאל לימין)‪ s,a,b,c,d,e,f,h,i,k :‬בכל אחד מהסעיפים יש‬
‫לצייר גרף ‪ G‬כך שיקיים את התנאים הבאים‪ 01( :‬נק')‬
‫‪.i‬‬
‫‪ G‬הוא גרף לא מכוון‪ ,‬דרגת ‪ s‬היא ‪ 0‬ודרגת ‪ b‬היא ‪.1‬‬
‫‪.ii‬‬
‫‪ G‬לא מכוון ודרגת כל הצמתים היא ‪2‬‬
‫יש להניח שרשימת השכנויות של הגרף ‪ G‬ממוינת בסדר אלפביתי (כלומר סדר סריקת הקודקודים הסמוכים‬
‫לקודקוד הנתון הוא סדר אלפביתי)‬
‫נתון גרף )‪ G(V,E‬עם קודקוד התחלה ‪ S‬ומשקלי קשתות אי שליליים‪.‬‬
‫ב‪ .‬הצע דרך (תוך שימוש באחד או יותר מהאלגוריתמים שנלמדו בכיתה) לבדוק האם קיים קודקוד כלשהו בגרף ‪G‬‬
‫אשר משקל המסלול הקל ביותר מ‪ S-‬אליו שווה ל‪ X-‬עבור ‪ X‬חיובי כלשהו‪ .‬מהי סיבוכיות האלגוריתם המוצע‪1( .‬‬
‫נק')‬
‫ג‪.‬‬
‫לאחר הרצה של אלגוריתם ‪ Dijkstra‬התקבל הפלט הבא‪:‬‬
‫‪-‬‬
‫לכל קודקוד בגרף (ובפרט לקודקוד הסיום ‪ )t‬ידוע משקל המסלול הקל ביותר מקודקוד ‪ S‬אליו‪.‬‬
‫‪-‬‬
‫ידוע המסלול הקל ביותר מ‪ S-‬ל‪(.t-‬כלומר אוסף הקודקודים והסדר שלהם במסלול)‬
‫"קודקוד אמצע הדרך" הוא קודקוד העונה על התנאים הבאים‪:‬‬
‫‪ )0‬הקודקוד הוא חלק מהמסלול הקל ביותר בין ‪ S‬ל‪.t-‬‬
‫‪ )2‬משקל המסלול הקל ביותר מקודקוד ‪ S‬אליו שווה למשקל המסלול הקל ממנו לקודוקוד ‪.t‬‬
‫תאר אלגוריתם (תיאור מילולי בלבד) אשר זמן הריצה שלו הוא לכל היותר )‪ O(n‬הבודק האם קיים "קודקוד אמצע‬
‫הדרך" בגרף‪ .‬הסבר במילים את נכונות האלגוריתם שהצעתם ונמק מדוע הוא עומד בסיבוכיות הנדרשת‪ 01( .‬נק')‬
‫‪3‬‬
‫שאלה ‪ 20( 4‬נקודות)‬
‫"שידוך" בגרף )‪ G = (V, E‬הינו קבוצת קשתות ‪ M‬כך שאין שתי קשתות ב‪ M-‬שחולקות צומת קצה‪.‬‬
‫לדוגמה עבור הגרף הבא‪:‬‬
‫‪B‬‬
‫‪A‬‬
‫‪D‬‬
‫‪F‬‬
‫‪C‬‬
‫‪E‬‬
‫שידוך אפשרי הוא‪( M={(A,B),(C,D),(E,F){:‬איור ‪ )0‬שידוך בלתי אפשרי הוא {)‪( M={(A,B),(A,D),(C,E‬איור ‪ )2‬מכיוון‬
‫שהקשתות )‪ (A,B‬ו‪ (A,D)-‬חולקות את אותו צומת קצה ‪.A‬‬
‫‪B‬‬
‫‪B‬‬
‫‪A‬‬
‫‪C‬‬
‫‪D‬‬
‫‪F‬‬
‫‪A‬‬
‫‪D‬‬
‫‪E‬‬
‫‪C‬‬
‫‪F‬‬
‫איור ‪0‬‬
‫‪E‬‬
‫איור ‪2‬‬
‫בשאלה זו עליך להציע אלגוריתם תכנות דינאמי המוצא שידוך מקסימום בעץ )‪( .T = (V, E‬שידוך מקסימום= פתרון‬
‫המשדך בין כמה שיותר זוגות צמתים בעץ‪ ,‬שים לב העץ אינו חייב להיות בינארי)‪ .‬לכל צומת ‪ v‬מתקיים‪ :‬או שהצומת‬
‫משודך בדיוק לאחד מבניו‪ ,‬או שלא‪.‬‬
‫א‪ .‬להלן נוסחאות רקורסיבית‪( ) :‬‬
‫לאחד מבניו‪ ,‬ו‪( ) -‬‬
‫לחישוב השידוך המקסימלי בתת‪-‬העץ המושרש ב‪ v-‬כאשר ‪ v‬אינו משודך‬
‫כאשר ‪ v‬משודך לאחד מבניו‪.‬‬
‫}) (‬
‫}}) (‬
‫) ( {‬
‫)‬
‫(∑‬
‫) ( {‬
‫) ( {‬
‫)‬
‫)‬
‫(∑‬
‫(‬
‫) (‬
‫) (‬
‫הסבר במילים את הנוסחאות וכיצד ניתן לקבל באמצעותן את השידוך המקסימלי בעץ כולו‪ 1( .‬נק')‬
‫ב‪ .‬מהו זמן הריצה של האלגוריתם על עץ עם ‪ n‬צמתים? (‪ 7‬נק')‬
‫ג‪.‬‬
‫כתוב פסאודו‪-‬קוד או קוד בפייטון (לבחירתך) המחשב את השידוך המקסימלי בעץ‪.max_match(T) ,‬‬
‫לשם כך‪ ,‬הנח כי ‪ T‬הוא מצביע לשורש העץ (בפייתון – משתנה מסוג ‪ ,)Node‬וכי כל צומת מכיל רשימה ‪ sons‬של‬
‫מצביעים לבניו (בעלים הרשימה ריקה)‪ 5(.‬נק')‬
‫‪4‬‬
‫הפקולטה להנדסה‬
‫המחלקה להנדסת תעשייה‬
‫סמסטר ב' תשע"ב‬
‫בחינת מעבר מועד ב'‬
‫משך הבחינה‪ 3 :‬שעות‬
‫ת‪.‬ז‪_______________ .‬‬
‫מבחן בקורס "מבני נתונים"‬
‫‪1750-0101‬‬
‫מרצה‪ :‬רעות נוחם‬
‫מתרגלת‪ :‬נגה לוי‬
‫‪-‬‬
‫זהו מבחן חסוי‪ .‬אין להעתיק את השאלות למחברת הבחינה‪ ,‬עם סיום הבחינה יש להחזיר את טופס‬
‫הבחינה עם מחברת הבחינה‪.‬‬
‫‪-‬‬
‫חומר עזר‪ 2 :‬דפים כתובים ומחשבון‪.‬‬
‫‪-‬‬
‫נא להקפיד על כתב יד ברור‬
‫‪-‬‬
‫נא להקפיד על תשובות קצרות ובהירות (יתכן מצב שבו המוסיף גורע)‬
‫‪-‬‬
‫במהלך הבחינה יענו שאלות הבהרה המתייחסות לטופס הבחינה בלבד‬
‫‪-‬‬
‫יש לענות על כל השאלות ‪0-4‬‬
‫‪-‬‬
‫אסורה אחזקת טלפונים סלולאריים‪ ,‬וכל מכשיר אלקטרוני אחר בקרבת מקום‪.‬‬
‫בהצלחה‬
‫כל הזכויות שמורות ©‬
‫מבלי לפגוע באמור לעיל‪ ,‬אין להעתיק‪ ,‬לצלם‪ ,‬להקליט‪ ,‬לשדר‪ ,‬לאחסן מאגר מידע‪ ,‬בכל דרך שהיא‪ ,‬בין‬
‫מכנית ובין אלקטרונית או בכל דרך אחרת כל חלק שהוא מטופס הבחינה‪.‬‬
‫‪1‬‬
‫שאלה ‪ 25( 1‬נקודות)‬
‫ענה נכון‪/‬לא נכון לגבי כל אחד מהמשפטים הבאים‪ ,‬והסבר ב‪ 3 -‬שורות לכל היותר את תשובתך‪ .‬נקודה תינתן עבור‬
‫תשובה נכונה ועוד ארבע נקודות עבור הסבר מלא‪ .‬תשובה לא נכונה עשויה לזכות בניקוד חלקי אם ההסבר מעיד על‬
‫הבנת הנקודה‪ .‬אם לדעתך המשפט נכון רק במקרים מסוימים‪ ,‬פרט באילו מקרים‪ .‬יש לענות על שאלה זו בטופס‬
‫הבחינה‪ ,‬במקום המיועד‪.‬‬
‫א‪ .‬אם נפעיל את אלגוריתם המיון ‪ InsertionSort‬פעם אחת עבור הקלט‪ 05,6,16,47,32 :‬ופעם נוספת עבור הקלט‪:‬‬
‫‪ 5,2,27,01,03‬זמן הריצה בפועל בשני המקרים יהיה זהה‬
‫נכון‪ .‬זהו מיון מבוסס השוואות ויחס הסדר בין הקלטים זהה‪.‬‬
‫ב‪ .‬בכדי למצוא את המסלול הקצר ביותר בגרף ממושקל בו משקלי כל הקשתות זהים אלגוריתם ‪ BFS‬עדיף על‬
‫אלגוריתם ‪Dijkstra‬‬
‫נכון‪ .‬מספיק למצוא את המסלול עם מס' הקשתות המינימלי‬
‫ג‪.‬‬
‫) (‬
‫נתון‬
‫) (‬
‫אזי )‬
‫) (‬
‫(‬
‫לא נכון‪ .‬לפי המקרה השלישי של משפט המסטר )‬
‫) (‬
‫(‬
‫ד‪ .‬נתונה טבלת ‪:hash‬‬
‫‪9‬‬
‫‪1‬‬
‫‪5‬‬
‫‪6‬‬
‫‪39‬‬
‫‪7‬‬
‫‪3‬‬
‫‪4‬‬
‫‪77‬‬
‫‪2‬‬
‫‪0‬‬
‫‪43‬‬
‫‪1‬‬
‫‪09‬‬
‫אם פונקצית ה‪ hash-‬המשמשת להכנסת האיברים היא ‪ ,h(x)=x mod 10‬הטיפול בהתנגשויות מתבצע בשיטת ה‪-‬‬
‫‪ linear probing‬וידוע כי לא בוצעה אף פעולת מחיקה מהטבלה אז ניתן לומר בודאות כי הערך ‪ 09‬הוכנס לטבלה‬
‫לפני הערך ‪.39‬‬
‫לא נכון‪ 11 ,‬הוכנס בוודאות אחרי ‪91‬‬
‫ה‪ .‬בגרף ממושקל ‪ G‬שיש בו צלע ‪ v‬אשר משקלה גדול ממשקלה של כל צלע אחרת ב‪ ,G-‬מתקיים ש‪ v-‬אינה שייכת‬
‫לעץ המסלולים הקצרים (‪.)SPT=shortest path tree‬‬
‫לא נכון‪ ,‬יתכן שזו הקשת היחידה המחברת בין ‪ 2‬צלעות‪.‬‬
‫שאלה ‪ 27( 2‬נקודות)‬
‫א‪.‬‬
‫בנה עץ חיפוש בינארי אשר גובהו קטן שווה ל‪ ,4 -‬מהמפתחות הבאים‪ 7( 11,20,25,50,52,65,71 :‬נק')‬
‫ב‪.‬‬
‫ידוע כי הפלט הבא התקבל משיטוט ב‪ postorder -‬בעץ חיפוש בינארי‪ .‬שחזר את העץ המקורי על סמך הפלט‪:‬‬
‫‪( 0,6,7,1,5,2,01,09,05,07,9‬אם קיימות מס' אפשרויות הצג אחת מהן בלבד) (‪ 6‬נק')‬
‫ג‪.‬‬
‫(סעיף זה אינו תלוי בסעיפים הקודמים) סטודנטים נרשמים לאוניברסיטה ע"י מילוי טפסים מקוונים באינטרנט‪.‬‬
‫ניתן להניח כי מספר הנרשמים מאפשר לאחסן את כל הטפסים בזכרון‪.‬‬
‫‪ )0‬הצע מבנה נתונים שיאפשר למרכז המרשם לטפל בטפסי ההרשמה ע"פ סדר יורד של ציון הסכם‪ ,‬כאשר זמן‬
‫הגישה לטופס של המועמד בעל ציון הסכם הגבוה ביותר הוא )‪ .O(1‬מה יהיה זמן ההכנסה של טופס בקשה‬
‫חדש? מהו זמן מחיקת טופס בקשה שכבר טופל? נמק תשובתך‪ 1( .‬נק')‬
‫‪ )2‬האוניברסיטה החליטה לטפל בנרשמים לפי פקולטה ולתת עדיפות שונה לכל פקולטה‪ .‬סדר העדיפות בתוך כל‬
‫פקולטה נשאר כשהיה (כלומר בסדר יורד ע"פ ציון הסכם)‪ .‬הצע מבנה נתונים שיאפשר למרכז למרשם לגשת‬
‫בזמן )‪ O(1‬אל הטופס הבא בקבוצת הנרשמים למחלקה בעלת העדיפות הגבוהה ביותר‪( .‬הנח כי קבוצת‬
‫המחלקות היא דינאמית כלומר מוציאים ומוסיפים מחלקות לטיפול) (‪ 1‬נק')‬
‫‪2‬‬
‫פתרון שאלה ‪2‬‬
‫א‪ .‬פתרון אפשרי (לא יחיד)‪:‬‬
‫‪50‬‬
‫‪0‬‬
‫‪20‬‬
‫‪0‬‬
‫‪52‬‬
‫‪0‬‬
‫‪47‬‬
‫‪25‬‬
‫‪11‬‬
‫‪55‬‬
‫‪0‬‬
‫‪9‬‬
‫ב‪.‬‬
‫‪2‬‬
‫‪15‬‬
‫‪14‬‬
‫‪4‬‬
‫‪19‬‬
‫‪1‬‬
‫‪11‬‬
‫ג‪.‬‬
‫‪1‬‬
‫‪5‬‬
‫‪5‬‬
‫‪ )0‬נשתמש בערימת מקסימום‪ .‬הגישה לשורש היא )‪ o(1‬הכנסת טופס חדש ומחיקת טופס קיים יהיו )‪O(log n‬‬
‫‪ )2‬נשתמש בערימה של ערימות‪ .‬הערימה הראשית תסודר לפי העדיפות של כל פקולטה‪ ,‬כל פקולטה תחזיק את‬
‫המועמדים שלה בערימת מקסימות לפי ציון הסכם‪.‬‬
‫שאלה ‪ 28( 3‬נקודות)‬
‫(הערה‪ :‬סעיפי השאלה אינם תלויים זו בזה)‬
‫א‪ .‬בהינתן סדר הסריקה הבא של ‪ BFS‬על גרף קשיר ‪( G‬משמאל לימין) ‪ s,a,b,c,d,e,f,h,i,k‬בכל אחד מהסעיפים יש‬
‫לצייר גרף ‪ G‬כך שיקיים את התנאים הבאים‪ 01( :‬נק')‬
‫‪.i‬‬
‫‪ G‬הוא גרף לא מכוון‪ ,‬דרגת ‪ s‬היא ‪ 0‬ודרגת ‪ b‬היא ‪.1‬‬
‫‪.ii‬‬
‫‪ G‬לא מכוון ודרגת כל הצמתים היא ‪2‬‬
‫יש להניח שרשימת השכנויות של הגרף ‪ G‬ממוינת בסדר אלפביתי (כלומר סדר סריקת הקודקודים הסמוכים‬
‫לקודקוד הנתון הוא סדר אלפביתי)‬
‫נתון גרף )‪ G(V,E‬עם קודקוד התחלה ‪ S‬ומשקלי קשתות אי שליליים‪.‬‬
‫ב‪ .‬הצע דרך (תוך שימוש באחד או יותר מהאלגוריתמים שנלמדו בכיתה) לבדוק האם קיים קודקוד כלשהו בגרף ‪G‬‬
‫אשר משקל המסלול הקל ביותר מ‪ S-‬אליו שווה ל‪ X-‬עבור ‪ X‬חיובי כלשהו‪ .‬מהי סיבוכיות האלגוריתם המוצע‪1( .‬‬
‫נק')‬
‫ג‪.‬‬
‫לאחר הרצה של אלגוריתם ‪ Dijkstra‬התקבל הפלט הבא‪:‬‬
‫‪-‬‬
‫לכל קודקוד בגרף (ובפרט לקודקוד הסיום ‪ )t‬ידוע משקל המסלול הקל ביותר מקודקוד ‪ S‬אליו‪.‬‬
‫‪-‬‬
‫ידוע המסלול הקל ביותר מ‪ S-‬ל‪(.t-‬כלומר אוסף הקודקודים והסדר שלהם במסלול)‬
‫"קודקוד אמצע הדרך" הוא קודקוד העונה על התנאים הבאים‪:‬‬
‫‪3‬‬
‫‪ )0‬הקודקוד הוא חלק מהמסלול הקל ביותר בין ‪ S‬ל‪.t-‬‬
‫‪ )2‬משקל המסלול הקל ביותר מקודקוד ‪ S‬אליו שווה למשקל המסלול הקל ממנו לקודוקוד ‪.t‬‬
‫תאר אלגוריתם (תיאור מילולי בלבד) אשר זמן הריצה שלו הוא לכל היותר )‪ O(n‬הבודק האם קיים "קודקוד‬
‫אמצע הדרך" בגרף‪ .‬הסבירו במילים את נכונות האלגוריתם שהצעתם ונמקו מדוע הוא עומד בסיבוכיות הנדרשת‪.‬‬
‫(‪ 01‬נק')‬
‫פתרון שאלה ‪3‬‬
‫‪s‬‬
‫א‪.‬‬
‫‪s‬‬
‫‪.i‬‬
‫‪.ii‬‬
‫‪a‬‬
‫‪a‬‬
‫‪c‬‬
‫‪c‬‬
‫‪b‬‬
‫‪k‬‬
‫‪d‬‬
‫‪i‬‬
‫‪e‬‬
‫‪f‬‬
‫‪b‬‬
‫‪d‬‬
‫‪e‬‬
‫‪f‬‬
‫‪h‬‬
‫‪i‬‬
‫‪h‬‬
‫‪k‬‬
‫ב‪ .‬נפעיל ‪ Dijkstra‬ונקבל לכל קודקוד את משקל המסלול הקל ביותר אליו‪ .‬אם נקבל קודקוד שהמשקל‬
‫אליו שווה ל‪ X-‬בסוף ההרצה מצאנו‪ .‬בכל פעם שנעביר קודקוד מ‪ T -‬ל‪ P-‬נשווה את הערך של המסלול‬
‫הקל אליו ל‪ x-‬אם מצאנו אפשר לעצור ולהחזיר ‪ true‬אם סיימנו ולא מצאנו אז ‪ .false‬זה לא משנה את‬
‫הסיבוכיות של ‪ Dijkstra‬ולכן הסיבוכיות הכללית היא ))‪.o(log n (m+n‬‬
‫ג‪ .‬נעבור קודקוד קודקוד במסלול הקל ביותר ונבדוק האם ערך המסלול אליו שווה למחצית משקל‬
‫המסלול הקל היותר ל‪ .t-‬אורך המק"ב הוא לכל היותר ‪ n‬ולכן נעבור לכל היותר על ‪ n‬קודקודים‪.‬‬
‫שאלה ‪ 22( 4‬נקודות)‬
‫"שידוך" בגרף )‪ G = (V, E‬הינו קבוצת קשתות ‪ M‬כך שאין שתי קשתות ב‪ M-‬שחולקות צומת קצה‪.‬‬
‫לדוגמה עבור הגרף הבא‪:‬‬
‫‪B‬‬
‫‪A‬‬
‫‪D‬‬
‫‪F‬‬
‫‪C‬‬
‫‪E‬‬
‫שידוך אפשרי הוא‪( M={(A,B),(C,D),(E,F){:‬איור ‪ )0‬שידוך בלתי אפשרי הוא {)‪( M={(A,B),(A,D),(C,E‬איור ‪ )2‬מכיוון‬
‫שהקשתות )‪ (A,B‬ו‪ (A,D)-‬חולקות את אותו צומת קצה ‪.A‬‬
‫‪B‬‬
‫‪B‬‬
‫‪A‬‬
‫‪D‬‬
‫‪F‬‬
‫‪C‬‬
‫‪E‬‬
‫‪A‬‬
‫‪D‬‬
‫‪F‬‬
‫‪C‬‬
‫‪7‬‬
‫‪E‬‬
‫בשאלה זו עליך להציע אלגוריתם תכנות דינאמי המוצא שידוך מקסימום בעץ )‪( .T = (V, E‬שידוך מקסימום= פתרון‬
‫המשדך בין כמה שיותר זוגות צמתים בעץ)‪ .‬לכל צומת ‪ v‬מתקיים‪ :‬או שהצומת משודך בדיוק לאחד מבניו‪ ,‬או שלא‪.‬‬
‫א‪ .‬להלן נוסחאות רקורסיבית )‪ c-(v‬לחישוב השידוך המקסימלי בתת‪-‬העץ המושרש ב‪ v-‬כאשר ‪ v‬אינו משודך אחד‬
‫מבניו‪ ,‬ונוסחא רקורסיבית )‪ c+(v‬כאשר ‪ v‬משודך לאחד מבניו‪.‬‬
‫}) (‬
‫) ( {‬
‫}}) (‬
‫)‬
‫(∑‬
‫) ( {‬
‫) ( {‬
‫)‬
‫)‬
‫(∑‬
‫(‬
‫) (‬
‫) (‬
‫הסבר במילים את הנוסחאות וכיצד ניתן לקבל באמצעותן את השידוך המקסימלי בעץ כולו‪ 1( .‬נק')‬
‫ב‪ .‬מהו זמן הריצה של האלגוריתם על עץ עם ‪ n‬צמתים? (‪ 7‬נק')‬
‫ג‪.‬‬
‫כתוב פסאודו‪-‬קוד או קוד בפייטון (לבחירתך) המחשב את השידוך המקסימלי בעץ‪.max_match(T) ,‬‬
‫לשם כך‪ ,‬הניח כי ‪ T‬הוא מצביע לשורש העץ (בפייתון – משתנה מסוג ‪ ,)Node‬וכי כל צומת מכיל רשימה ‪ sons‬של‬
‫מצביעים לבניו (בעלים הרשימה ריקה)‪ 5(.‬נק')‬
‫פתרון שאלה ‪4‬‬
‫‪-‬‬
‫‪+‬‬
‫‪-‬‬
‫א‪ .‬הסבר‪ c (v) :‬הוא סכום של המקסימום בין )‪ c (v‬ל‪ c (v) -‬מעל הבנים של ‪.v‬‬
‫לחישוב )‪ c+(v‬יש להחליט למי מהבנים '‪ u‬משדכים את ‪ .v‬עבור הבן המשודך ל‪ v-‬לוקחים את )'‪ c-(u‬ועבור שאר הבנים‬
‫לוקחים את המקסימום בין )‪ c-(v‬ל‪ .c+(v)-‬על מנת להחליט מיהו '‪ ,u‬נבחר בבן שממקסם את הביטוי‪.‬‬
‫בגלל תת‪-‬המבנה האופטימלי של הבעיה‪ ,‬אנחנו עוברים כך על כל השידוכים האפשריים‪.‬‬
‫ב‪.‬‬
‫חישוב )‪ c-(v‬לינארי בדרגה של ‪.v‬‬
‫חישוב )‪ – c+(v‬נחשב עבור כל אחד מהבנים את ה סטיה מ‪ c-(v)-‬ב‪.O(1)-‬‬
‫קיבלנו שלכל צומת ‪ v‬זמן הריצה הוא ))‪ O(deg(v‬ובסה"כ )‪( O(E) = O(V‬זהו עץ)‪.‬‬
‫ג‪.‬‬
‫כתוב פסאודו‪-‬קוד או קוד בפייטון (לבחירתך) המחשב את השידוך המקסימלי בעץ‪.max_match(T) ,‬‬
‫לשם כך‪ ,‬הניח כי ‪ T‬הוא מצביע לשורש העץ (בפייתון – משתנה מסוג ‪ ,)Node‬וכי כל צומת מכיל רשימה ‪ sons‬של‬
‫מצביעים לבניו (בעלים הרשימה ריקה)‪ 1(.‬נק')‬
‫‪class Node:‬‬
‫‪def __init__(self, sons = []):‬‬
‫‪self.sons = sons‬‬
‫‪self.c_minus_val = None‬‬
‫‪self.c_plus_val = None‬‬
‫‪def add_son(self, son):‬‬
‫)‪self.sons.append(son‬‬
‫‪def max_match(self):‬‬
‫))(‪return max(self.c_minus(), self.c_plus‬‬
‫‪def c_minus(self):‬‬
‫‪5‬‬
if not(self.c_minus_val):
self.c_minus_val = 0
for son in self.sons:
self.c_minus_val += max(son.c_plus(), son.c_minus())
return self.c_minus_val
def c_plus(self):
if not(self.c_plus_val):
if len(self.sons) == 0
self.c_plus_val = 0
else:
vals][ =
for son in self.sons:
vals.append(son.c_minus() - max(son.c_plus(), son.c_minus())
self.c_plus_val = 1 + self.c_minus() + max(vals)
return self.c_plus_val
5