מבני נתונים ואלגוריתמים 0512.2510 בהצלחה, ועד הנדסה ת"ז: אוניברסיטת תל-אביב הפקולטה להנדסה מועד א' סמסטר א ,תשע"ה במבני נתונים ואלגוריתמים זמן המבחן :שלוש שעות תאריך11.2.15 : מרצה :דנה רון הנחיות: מותר להשתמש בארבעה דפי עזר .אין להשתמש בשום סוג של מחשב. המבחן כולל 4שאלות .הניקוד על כל שאלה מופיע בסוגריים. כתבו את תשובותיכם על גבי טופס המבחן במקום המוקצה לכך .מומלץ מאוד לכתוב תחילה את התשובה במחברת הטיוטה שקיבלתם ורק אחר כך להעתיק אותה ,בצורה ברורה וקריאה ,לטופס המבחן. נמקו בקצרה אך בבהירות את כל טענותיכם .טענה ללא נימוק לא תתקבל. מותר להשתמש במשפטים ואלגוריתמים שנלמדו בשיעורים ובתרגולים או שהופיעו בתרגילי הבית. במקרה כזה ניתן לצטט את מה שנלמד ללא צורך בהוכחה .לעומת זאת ,אם אתם משתמשים בגרסה שונה מעט של אלגוריתם או ניתוח כלשהו יש להסביר במדויק מה ההבדלים. במבחן זה 8עמודים (כולל עמוד זה) .אנא ודאו שכולם ברשותכם. אל תשכחו לרשום מספר ת"ז במקום המסומן. ב ה צ ל ח ה! .3 .4 .1 א) א) א) ב) ב) ב) .2 ג) 1 שאלה 30( 1נק') נתבונן באלגוריתם הבא המקבל כקלט מערך Aבגודל ,nשני אינדקסים p,rכך ש 1 p , r nופרמטר ,k .2kn1/2הפרוצדורה Procגם היא מקבלת אותם פרמטרים ,וזמן ריצתה ) ( (s (log k)2עבור ,)s=r-p+1לכל מערך קלט. )Alg(A,p,r,k { s := r-p+1 )if (s 1 return t := s/k )for (j = 0 to k-1 )Alg(A,p+jt,p+(j+1)t-1,k )Proc(A,p,r,k } א 15( .נק') מהו זמן הריצה של הפרוצדורה Algכפונקציה של nו kכאשר היא נקראת עם ?p=1, r=nכלומר ,מהי ) g(n,kכך שזמן הריצה של Algהוא )) ?(g(n,kמותר להניח ש nהיא חזקה של .kשימו לב שלא ניתן להניח ש k הוא קבוע (לדוגמה ,ייתכן ו .)k= n1/4נזכיר כי .logab = log2b/log2a עליכם לפעול לפי ההנחיה הבאה :תארו את עץ הרקורסיה של האלגוריתם; כמה קדקודים יש בכל רמה? מה גובה העץ? מה תרומת הרמה ה iבעץ לזמן הריצה? _____________________________________________________________________________________________ _______ ______________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ____________________________________________ _________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _______________ ______________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 2 ב 15( .נק') נשנה את האלגוריתם באופן הבא (כמקודם A ,הוא מערך בגודל ,nו :)2kn1/2 )Alg2(A,p,r,k { s := r-p+1 )if (s < k return )IA := Proc2(A,p,r,k { )for (j = 1 to k )Alg2(A,IA[j],IA[j+1]-1,k } )Proc(A,p,r,k } כאשר Proc2מחזירה מערך IAבגודל k+1כך ש p=IA[1]<IA[2]<…<IA[k+1]=r +1וזמן ריצתה גם הוא ) (s (log k)2עבור ,s=r-p+1לכל מערך קלט .לדוגמה ,עבור p=1, r=9 ,n=9ו ,k=3ייתכן ו ].IA=[1,2,5,10 תנו חסם עליון טוב ככל האפשר על זמן הריצה של Alg2כפונקציה של nו kכאשר היא נקראת עם .p=1, r=n עליכם לפעול לפי ההנחיה הבאה :תנו חסם עליון טוב ככל האפשר על מספר הרמות בעץ הרקורסיה .כלומר ,עליכם להצדיק מדוע מספר הרמות חסום מלמעלה על ידי מה שאתם טוענים עבור כל מערך קלט .Aכמו כן תנו חסם עליון על התרומה של כל רמה .לא ניתן לטעון שעץ מסוים הוא הגרוע ביותר בלי להצדיק מדוע אכן כל עץ אחר נותן זמן ריצה גדול יותר (או שווה). _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ______________________________ _______________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _ ____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ______________________________________ _______________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 3 שאלה 20( 2נק') בשאלה זו נדון במבנה נתונים עבור עץ בינארי בו כל קדקוד הוא רשומה עם השדות הבאים VAL :ובו הערך בקדקוד (מספר) PAR ,שהוא מצביע להורה של הקדקוד ,LC ,שהוא מצביע לילד השמאלי של הקדקוד ,ו ,RCשהוא מצביע לילד הימני של הקדקוד (אם אין לקדקוד הורה/ילד ימני /ילד שמאלי אז המצביע המתאים הוא .)NULLכמו כן יש שדה נוסף SIZE ,שמכיל את מספר הקדקודים בתת העץ שקדקוד זה הוא השורש שלו (כולל הקדקוד עצמו). לדוגמה ,עבור: הגודל של תתי העצים ששורשיהם 2ו 10הוא ,1של 7הוא ,2ושל 5הוא 4 5 7 2 10 יהי Tעץ חיפוש בינארי עם nקדקודים המיוצג על ידי מבנה הנתונים שתואר למעלה .הניחו כי המספרים בעץ (בשדה )VALשונים זה מזה .כתבו פסאודו-קוד עבור פרוצדורה רקורסיבית ,המקבלת כקלט מצביע לשורש של העץ Tומספר ,xכך שאם xנמצא בעץ היא מחזירה את מיקומו של xבסדר ממוין מקטן לגדול של המספרים בעץ (כלומר, אם הוא הכי קטן ,היא מחזירה ,1אם הוא השני הכי קטן ,היא מחזירה ,2וכך הלאה) ,ואם הוא לא נמצא בעץ אז היא מחזירה .NOT-FOUNDלדוגמה ,עבור העץ למעלה ו ,x = 7הפלט הוא.3 : הפרוצדורה יכולה לקבל פרמטר נוסף/פרמטרים נוספים ויש לכתוב במפורש מה ערכו/ם בקריאה הראשונית לפרוצדורה .זמן הריצה של הפרוצדורה צריך להיות לכל היותר ליניארי בגובה העץ. הוסיפו הסבר קצר המבהיר את פעולת הפרוצדורה. _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ___________________________________ __________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ______ _______________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ___________________________________________ __________________________________________________ 4 שאלה 20( 3נק') נתונה רשת זרימה ) N=(G,s,t,cכאשר ) G=(V,Eהוא גרף מכוון sV ,הוא קדקוד המקור tV ,הוא קדקוד היעד ,ו cהיא פונקציית קיבול על הקשתות .לכל קשת c(e) ,eEמספר שלם וחיובי ממש (אם אין קשת מ uל vאז .)c(u,v)=0נזכיר שעבור פונקציית זרימה fאנו מסמנים את ערכה ב | .|fנתון ש * fהיא פונקציית זרימה עם ערך מרבי עבור .N -e עבור קשת eב , Eנסמן ב Nאת הרשת המתקבלת מ Nכאשר מסירים את eמ ( Eכך שמורידים את הקיבול שלה ל ,)0ומלבד זאת לא משנים דבר ברשת .נסמן ב f*-eפונקציית זרימה עם ערך מרבי ב .N-eנאמר ש eהיא קשת הכי זניחה אם | |f*| - |f*-eמינימאלי ביחס לכל הקשתות בגרף (כאשר ייתכן ויש יותר מקשת אחת כזו). עבור כל אחת משלוש הטענות הבאות ,ענו האם היא נכונה תמיד (כלומר ,לכל רשת )Nאו שאינה נכונה .אם היא אינה נכונה ,תנו דוגמה נגדית ,ואם היא נכונה נמקו במדויק מדוע (בהתבסס על מה שלמדנו בכיתה). א 7( .נק') אם f*(e) = 0אז eהיא קשת הכי זניחה. _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ ב 7( .נק') אם })’ f*(e) = mine’E {f*(eאז eהיא קשת הכי זניחה. _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ ג 6( .נק') אם eשייכת לחתך עם קיבול מינימאלי ב Nובו לפחות שתי קשתות אז בהכרח היא אינה קשת הכי זניחה. _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ 5 שאלה 30( 4נק') נתונות שתי מחרוזות ו מעל אותו א"ב כאשר nהוא האורך של ,ו mהוא האורך של . המחרוזות מיוצגות על ידי מערכים כך ש ] [jהוא התו ה jבמחרוזת . לדוגמה: ... n d e m e 2 c 1 b ... 2 a c a 1 b פונקציית התאמה } h : {1,…,n} {0,1,…,mמ ל הממפה בין חלק מהתווים ב לתווים זהים ב ,צריכה לקיים את התנאים הבאים: ( )1לכל ,1 j nאם ,h(j) > 0אז ]);[j] = [h(j ( )2לכל ,1 j < j’ nאם h(j) > 0ו ,h(j’) > 0אז )’.h(j) < h(j לדוגמה ,עבור ו -מהדוגמה למעלה ,הפונקציה h(1)=3, h(2)=h(3)=h(4)=0, h(5)=4היא פונקציית התאמה: 5 3 4 e d 2 c 3 4 e 1 b 2 a a 1 c b וגם h(1)=0, h(2)=1, h(3)=2, h(4)=0, h(5)=4היא פונקציית התאמה: 5 e 4 d 4 e 3 2 c 3 a b 2 1 a 1 c b הערך של פונקציית התאמה הוא מספר האינדקסים 1jnכך ש .h(j)>0בדוגמאות שלמעלה ,ערך הפונקציה הראשונה 2וערך השנייה .3 בהינתן שתי מחרוזות נהיה מעוניינים למצוא פונקציית התאמה עם ערך מרבי. 6 ראשית נרצה לחשב את הערך המרבי. לשם כך ,נגדיר לכל 1 j n+1ו 1 k m+1את ) V(j,kלהיות הערך המרבי של פונקציית התאמה מ ] [j,…,nל ]( [k,…,mכאשר אם j=n+1אז ] [j,…,nמחרוזת ריקה ,ובאופן דומה ,אם ,k=m+1אז ] [k,…,mמחרוזת ריקה ,כך שבמקרים אלו ערך פונקציית ההתאמה הוא .)0 נשים לב שלכל 1 j nו : 1 k m ( )1אם לא קיים k r m ,rכך ש ] ,[j] = [rאז ];V[j][k] = V[j+1][k ( )2אחרת ,יהי rהאינדקס המינימאלי בין kל mהמקיים ] ,[j] = [rאז }]V[j][k] = max{V[j+1][k],1+V[j+1][r+1 א 18( .נק') כתבו פסאודו-קוד לאלגוריתם תכנון דינאמי שזמן ריצתו פולינומיאלי ב nו ,mהמקבל כקלט שתי מחרוזות ו ואת אורכן ,והמחזיר ערך מרבי של פונקציית התאמה מ ל . _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ___________________________ __________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ מה זמן הריצה של האלגוריתם שכתבתם? _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 7 ב 12( .נק') הראו ,בעזרת כתיבת פרוצדורה נוספת ,ואם יש צורך ,תוספת לפסאודו-קוד שכתבתם (אשר לא משנה אסימפטוטית את זמן הריצה של האלגוריתם) ,כיצד ניתן לקבל פונקציית התאמה עם ערך מרבי .כלומר ,הפרוצדורה הנוספת צריכה להדפיס זוגות )) (1,h(1)), (2,h(2)), …, (n,h(nעבור פונקציה hעם ערך מרבי (לפי הסדר ,משמאל לימין) .יש לכתוב במפורש עם אלו פרמטרים נקראת הפרוצדורה הנוספת ,וזמן הריצה שלה צריך להיות ליניארי ב .n _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ______________________________________________ _______________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _________________ ____________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 8 פתרון המבחן שאלה 1 א .לכל קדקוד פנימי בעץ הרקורסיה יש kילדים ,כך שברמה ה jיש kjקדקודים ,כל אחד מתאים לתת מערך בגודל .s= n/kjכיוון שהעלים מתאימים לתת מערכי בגודל 1הרי שרמת העלים היא ) . logk(n)=log2(n)/log2(kהתרומה של כל קדקוד ברמה jשאינה רמת העלים היא )) ((n/kj)log2(kכך שכל רמה מלבד רמת העלים תורמת סך הכל )) .(n log2(kכל עלה תורם זמן קבוע ,ומספר העלים nכך שביחד העלים תורמים ).(n סך הכל נקבל )).(n log(n) log(k הערות :כמעט כל הסטודנטים ענו נכון על סעיף זה. ב .גם עתה לכל קדקוד פנימי יש kילדים ,אך הקדקודים ברמה jאינם בהכרח מתאימים לתת מערכים בגודל זהה .עם זאת ,סכום הגדלים של תתי המערכים בכל רמה הוא לכל היותר nכך שביחד הם עדיין תורמים לכל היותר )) .O(n log2(kכיוון שתת המערך המתאים לכל קדקוד גודלו לכל היותר קטן ב k-1מהגודל של תת המערך המתאים להורה שלו (כי כל אחד מ k-1האחים שלו מתאים לגודל לפחות ,)1ונעצרים כאשר מגיעים לתת מערכים בגודל קטן מ ,kהרי שמספר הרמות בעץ הוא לכל היותר ) ,n/(k-1ונקבל חסם עליון של ).O(n2 log2(k)/k הערות ושגיאות נפוצות: .1רבים מהסטודנטים נתחו לא נכון את גובה העץ .בפרט חלק מהתשובות היו שגובה העץ הוא ) logk(nאו k שאינם נכונות לחלוטין .היו שציינו שגובה העץ חסום מלמעלה ע"י ) ,O(nזה כמובן נכון ,אך לא הדוק ,ולכן ניתן ניקוד חלקי. .2חלק מהסטודנטים לא שמו לב שסכום כל רמה בעץ מלבד העלים ,תורמת )) ,O(n log2(kבדיוק כמו בסעיף הראשון. .3חלק מהסטודנטים השאירו תשובות בצורה שאינה "נקיה" מבחינה אסימפטוטית ,לדוגמא n k 2 O במקום ) .O(n2 log2(k)/kלא הורדו על כך נקודות במקרה זה ,אך שימו לב להבא. n log k k 1 שאלה 2 יש הרבה צורות לפתור שאלה זו ,להלן אחת. הפרוצדורה נקראת עם pnodeשהוא מצביע לשורש העץ Tועם .smaller= 0באופן כללי ,בכל קריאה רקורסיבית, pnodeהוא מצביע לתת עץ בו נמצא ( xאם הוא בעץ) ו smallerהוא מספר הערכים שידוע שהם קטנים ממש מ x בעץ .הפרוצדורה עובדת בדומה ל Memberמבחינת החיפוש אחר xבעץ .הרקורסיה נעצרת או אם מגיעים ל pnodeשהוא ,NULLכלומר xלא בעץ ,או כאשר הערך ב pnodeשווה ל .xאם xקטן מהערך ב pnodeאז ממשיכים לילד השמאלי (בלי עדכון ,smallerכי לא למדנו על ערכים נוספים בעץ הקטנים מ .)xאחרת ( xגדול או שווה לערך בקדקוד) ,אם ל pnodeיש ילד שמאלי ,אז מגדילים את smallerבגודל של תת העץ שלו (כי כל הערכים בתת עץ זה קטנים מ .)xאם xשווה לערך ב pnodeאז מחזירים את ,smaller+1ואם xגדול מהערך ב pnodeאז ממשיכים לילד הימני עם .smaller+1 )Compute-Location(pnode,x,smaller { )if (pnode = NULL )return(NOT-FOUND )if (pnode VAL > x )return(pnode LC,x,smaller )if (pnode LC != NULL smaller := smaller + (pnode LC) SIZE )if (pnode VAL = x )return(smaller +1 )return(pnode RC,x,smaller+1 } הערות ושגיאות נפוצות: .1ניתן לפתור שאלה זו (והיו סטודנטים שעשו זאת) בלי לשלוח בקריאה הרקורסיבית פרמטר נוסף (,)smaller אלא על ידי הוספת (pnode LC) SIZEכאשר "חוזרים מהרקורסיה". .2ניתן לפתור שאלה זו על בסיס האבחנה שהמיקום של שורש של עץ בתוך העץ הוא גודל העץ פחות גודל העץ של תת הילד הימני (אם קיים כזה) .היו סטודנטים שעשו זאת נכון אך היו כמה שלא בצעו נכון את הקריאות הרקורסיביות ולכן קבלו תשובה שגויה. .3היו סטודנטים שפנו למצביעים בלי לבדוק קודם שהם אינם .NULL .4היו סטודנטים שלא הוסיפו +1בקריאות הרקורסיביות לילד הימני ו/או כאשר מוצאים את .x .5היו סטודנטים שניסו לפתור את הבעיה על בסיס ווריאציה על .INORDERגם אם עושים זאת נכון (ורבים מאלו שעשו זאת לא עשו זאת נכון) ,זמן הריצה ליניארי בגודל העץ ולא בגובהו ,כפי שנדרש. 2 שאלה 3 א .נכון .לאחר שמורידים את הקשת ,eפונקציית הזרימה * fהיא עדיין פונקציית זרימה חוקית ב N-eכך שהיא פונקציית זרימה עם ערך מרבי ב ( N-eכי ערך הזרימה המרבי אינו יכול לגדול אחרי הורדת קשת) ,כלומר, ,|f*| = |f*-e|=0ולכל קשת הפרש זה הוא לכל הפחות ,0כך שזה המינימום האפשרי. הערות: כמעט כל הסטודנטים ענו נכון על סעיף זה. ב .לא נכון .לדוגמה (s,b) ,היא קשת שעליה זרימה ,1ואם נוריד אותה אז ערך הזרימה ירד מ 3ל .2לעומת זאת (s,a) ,היא קשת שעליה זרימה ,2כלומר גבוהה יותר ,אך אם נוריד אותה ,ניתן יהיה עדיין 3/3 t להזרים 3על ידי הגדלת הזרימה על ) (s,bו ).(b,c 2/2 a 2/2 s c 1/3 b 1/3 הערות ושגיאות נפוצות :סטודנטים רבים ניסו להוכיח טענה זו בהתבסס על כך שכאשר מורידים קשת eאז ערך הזרימה המרבית החדשה היא ) |f*-e|=|f*| - f*(eוזה כמובן שגוי. ג .לא נכון .לדוגמה ,בחתך )} ,({s},{a,b,tשהוא חתך עם קיבול מינימאלי ,5 אם נוריד את הקשת ) (s,aאז הזרימה המרבית תרד ב ,2וכל קשת אחרת תגרום 2/2 לירידה של לפחות ( 2כלומר 2או )3ולכן היא כן קשת הכי זניחה (באופן t דומה גם ) (a,tאך לא שתי האחרות). a 2/2 s 3/3 3/3 b הערות ושגיאות נפוצות :חלק מהסטודנטים נתנו דוגמאות נגדיות לא חוקיות כגון רשתות שבהן אין שימור זרימה או שהזרימה אינה מקסימום .בנוסף ,על מנת להפריך טענה יש לתת דוגמא נגדית – והיו סטודנטים שהתעלמו מדרישה זו או שנתנו דוגמא נגדית שגויה. 3 4 שאלה ) ניתן להתעלם מהן בשלב זה, (השורות המודגשות עבור הסעיף הבא.א Max-Values(,,n,m) { for (k = 1 to m+1) /* Initialization of last row */ V[n+1][k] := 0 for(j = 1 to n) /* Initialization of last column */ {V[j][m+1] := 0; H[j][m+1]:=0 } for (j = n downto 1) { /* Compute starting from last row since V[j][k] is computed based on values in row j+1 of V */ for (k = 1 to m) { /* The order here is not important */ V[j][k] := V[j+1][k]; H[j][k]:=0 /* Initialize V[j][k] based on “no match” */ found := FALSE; r := k; while(found = FALSE and rm) /* Search for match */ if ([j] = [r]) /* Found a match */ found := TRUE /* Should exist while loop */ if (found = TRUE) if (1+V[j+1][r+1] > V[j][k]) /* Note: V[j][k] was initialized to V[j+1][k+1] */ { V[j][k] := 1+ V[j+1][r+1] ; H[j][k]:= r } } } Print-Match-Function(H,1,1) return(V[1][1]) /* This is the value of the best matching from [1,…,n] to [1,…,m] */ } בתוכה לולאה, איטרציותn ואז יש לולאה חיצונית שרצה,(n) כי האתחול לוקח זמן(n m2) זמן הריצה הוא .) איטרציות (ובתוכה מתבצע מספר קבוע של פעולותm ובתוכה עוד לולאה שרצה לכל היותר, איטרציותm שרצה :שגיאות נפוצות היו מי שלא דאגו לאתחול או שלא אתחלו נכון היו מי שבצעו סדר חישוב שגוי כך שפונים לכניסות במטריצה שעדיין לא חושבו הראשון שנותן התאמהr היו מי שבלולאה הפנימית לא השתמשו ב היו מי שלא החזירו ערך נכון . Bottom-Up וMemoization היו מי שכתבו קוד שהוא ערבוב שגוי של 4 .1 .2 .3 .4 .5 ב .בנוסף למטריצה Vנחזיק גם מטריצה Hכאשר נרצה ש ] H[j][kיהיה האינדקס אליו ממופה jבפונקציית התאמה אופטימאלית מ ] [j,…,nל ] [k,…,mראו שורות מודגשות בסעיף הקודם (בפרט ,נקרא לפרוצדורה עם .)j=k=1 פונקציית ההדפסה מופיעה להלן .בכל קריאה מודפס הזוג )] (j,H[j][kויש קריאה רקורסיבית לפי הערך של ] :H[j][kאם הוא 0זה אומר שאים התאמה ,כך שממשיכים עם j+1ו ,kואם יש התאמה (בין ] [jל )],[H[j][k אז ממשיכים עם j+1ו .H[j][k]+1נשים לב שאתחלנו את ] H[j][m+1ל ,0כך שכאשר מגיעים ל jעבורו , H[j][k]=mכלומר ,h(j)=mאז עבור כל ,j’>jנדפיס ) .(j’,0ניתן היה גם לממש באופן איטרטיבי. )Print-Match-Function(H,j,k { )if (j > n return )]print(j,H[j][k )if (H[j][k] = 0 )Print-Match-Function(H,j+1,k else )Print-Match-Function(H,j+1,H[j][k]+1 } שגיאות נפוצות: .1היו רבים שמילאו את מטריצת העזר כנדרש או באופן חלקי אך הפרוצדורה הייתה שגויה (על כך ניתן ניקוד חלקי). .2היו מי שניסו להשתמש במערך חד ממדי אך זה לא נותן את המידע הנדרש .3היו מי שלא הפרידו בקריאות הרקורסיביות בין המקרה שאין התאמה לבין המקרה שיש 5 ת"ז: אוניברסיטת תל-אביב הפקולטה להנדסה מועד ב' תשע"ד במבני נתונים ואלגוריתמים ,סמסטר ב' זמן המבחן :שלוש שעות תאריך.202.8.1 : מרצה :דנה רון הנחיות: מותר להשתמש בארבעה דפי עזר .אין להשתמש בשום סוג של מחשב. המבחן כולל 4שאלות .הניקוד על כל שאלה מופיע בסוגריים. כתבו את תשובותיכם על גבי טופס המבחן במקום המוקצה לכך .מומלץ מאוד לכתוב תחילה את התשובה במחברת הטיוטה שקיבלתם ורק אחר כך להעתיק אותה ,בצורה ברורה וקריאה ,לטופס המבחן. נמקו בקצרה אך בבהירות את כל טענותיכם .טענה ללא נימוק לא תתקבל. מותר להשתמש במשפטים ואלגוריתמים שנלמדו בשיעורים ובתרגולים או שהופיעו בתרגילי הבית. במקרה כזה ניתן לצטט את מה שנלמד ללא צורך בהוכחה .לעומת זאת ,אם אתם משתמשים בגרסה שונה מעט של אלגוריתם או ניתוח כלשהו יש להסביר במדויק מה ההבדלים. במבחן זה 11עמודים (כולל עמוד זה) .אנא ודאו שכולם ברשותכם. אל תשכחו לרשום מספר ת"ז במקום המסומן2 ב ה צ ל ח ה! 2. 2. א) 23 21 א) א) ב) ב) ג) ד) ג) 1 ב) ג) שאלה 38( .נק') יהי Aמערך שבו nמספרים שלמים .מספר xיקרא איבר רוב של Aאם מספר ההופעות של xב A-הוא לפחות . n / 2 1לדוגמה :אם n=7ו , A [1,5, 2,5,5,14,5] -אז 5הוא איבר רוב כי הוא מופיע 4פעמים שזה לפחות 7 / 2 1 4פעמים .שימו לב כי אם קיים איבר רוב במערך Aאזי הוא יחיד. נגדיר בעיה שנקרא לה "בעיית איבר הרוב" :בהינתן המערך Aוגודלו ,nיש למצוא האם יש ב Aאיבר רוב .אם כן, אז יש להחזיר איבר זה .אחרת ,יש להדפיס שלא קיים איבר רוב .בסעיפים הבאים נעסוק בבעיית איבר הרוב. א .8( 2נק') נניח שהמערך Aממוין (מקטן לגדול) .השלימו את הקוד שלעיל כך שיחזיר את איבר הרוב אם קיים כזה איבר ,ויחזיר NOT-FOUNDאם לא קיים כזה איבר .הסבירו בקיצור מדוע הפלט כנדרש .בפרט ,הסבירו מה מקיימים leftו ( .rightכתבו ההסבר לתשובתכם בשורות מימין לקוד). )Majority_Sorted(A,n { ]pos := n/2 + 1; maybe_majority := A[pos ;min := 1; max := pos ___________________________________________ { )while (min < max ___________________________________________ mid := (min+max)/2 )if (A[mid] = maybe_majority ___________________________________________ max := mid else min := mid + 1 ___________________________________________ } ___________________________________________ left := min; min := pos; max := n { )while (min < max ___________________________________________ mid := (min+max)/2 )if (A[mid] = maybe_majority ____________________________________ min := mid else max := mid - 1 ____________________________________ } right := min ____________________________________ )______________ if (right – left +1 )______________ (return ) ______________ (else return } מה זמן הריצה של הפרוצדורה כפונקציה של ( ?nכלומר ,מהו ) g(nכך שזמן הריצה הוא )) )?(g(nנמקו את תשובתכם. _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________ ________________________________________________________________ _____________________________________________________________________________________________ 2 מכאן והלאה לא נניח ש Aממוין (והסעיפים הבאים אינם בונים על סעיף א) .הפרוצדורה הבאה מקבלת מערך A בגודל nומספר שלם kבין 1ל ,nומחזירה מספר .נרצה להראות כי אם ב Aיש איבר רוב ,אז הקריאה ל ) Majority(A,nתחזיר אותו .אם אין איבר רוב ב Aאז הפרוצדורה תחזיר איבר כלשהו. )1. Majority(A,k { 2. 3. ) ]if ( k = 1 ) then return ( A[1 4. ; ]val := A[k 5. ;j := 1; count := 1 6. ) while( j < k and count > 0 7. { 8. ) if ( A[k-j] = val 9. count := count+1 10. else 11. count := count-1 12. ;j := j+1 13. } 14. ) if ( j = k 15. )return(val 16. else 17. ) )return( Majority(A,k-j } 18. יהי * jהערך של המשתנה jבסיום ריצת לולאת ה ( whileכלומר ,בשורה .)14 ב 1( 2נק') ( )1מהו * jכאשר קוראים ל ) Majority(A,kעם ] A=[1,5,2,5,5,14,5ו ?k=7הסבירו בקיצור. ( )2מהו * jכאשר קוראים ל ) Majority(A,kעם ] A=[1,14,2,5,5,5,5ו ?k=7הסבירו בקיצור. _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 3 עבור תת מערך ] A[1,…,tאנו אומרים ש xהוא איבר רוב ב ] A[1,…,tאם הוא מופיע לפחות t/2 +1פעמים ב ] .A[1,…,tנתונות העובדות הבאות (אין צורך להוכיח אותן). ( )1אם j*=kוקיים איבר רוב ב ] A[1,…,kאז ( valכפי שהוגדר בשורה )4הוא איבר רוב זה. ( )2אם j*<kוקיים איבר רוב ב ] A[1,…,kאז איבר זה הוא גם איבר הרוב ב ]*.A[1,…,k-j ג 6( 2נק') בשימוש בעובדות אלו הוכיחו באינדוקציה על kשאם ב ] A[1,..,kיש איבר רוב אז )Majority(A,k מחזירה אותו( .לכן בפרט ) Majority(A,nמחזירה את איבר הרוב במערך כולו אם קיים איבר כזה). _ ____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ______________________________________ _______________________________________________________ _____________________________________________________________________________________________ ד .8( 2נק') מהי ) g(nכך שזמן הריצה של ) Majority(A,nהוא )) ?(g(nנמקו את תשובתכם בעזרת תיאור מבנה עץ הרקורסיה של האלגוריתם. _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ ____________________________________ _________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _______________ ______________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ____________________________________________________ _________________________________________ _____________________________________________________________________________________________ 4 שאלה .3( .נק') בסיום הריצה של אלגוריתם הופמן מתקבל עץ של קוד רישא בינארי אופטימאלי (ביחס לא"ב הנתון והשכיחויות הנתונות) .השאלה היא כיצד ניתן לקבל את הקוד בהינתן העץ .נניח כי כל קדקוד בעץ הוא רשומה המכילה את השדות הבאים – LET :האות אותה מיצג הקדקוד (באם הוא עלה ,אחרת שדה זה ריק); – LCמצביע לילד השמאלי; – RC מצביע לילד הימני (אם הקדקוד הוא עלה אזי שני שדות אלה הם ;)NULLו – WEIGHTהמשקל של תת העץ. כתבו פסאודו קוד עבור פרוצדורה המקבלת מצביע לשרש של עץ שכזה (ואולי פרמטרים נוספים לבחירתכם) ומדפיסה רשימה של זוגות :אות ומילת הקוד המתאימה לאות ,עבור כל אות בא"ב . הניחו כי ניתן לקרוא לפרוצדורה ) strcat(s1,s2המקבלת שתי מחרוזות s1ו ( s2כאשר גם תו יחיד הוא מחרוזת) ומחזירה את המחרוזת שהיא שרשור של s1עם ( s2לדוגמא ,אם s1 = 1001ו s2 = 1אז ) strcat(s1,s2תחזיר את המחרוזת ,10011ואם s1היא המחרוזת הריקה אז ) strcat(s1,s2תחזיר את .)s2מותר לפרוצדורה להשתמש בזיכרון נוסף בגודל קבוע ,אך לא יותר מכך . הוסיפו הערות לצד הפסאודו-קוד ונתחו את זמן הריצה של האלגוריתם שכתבתם כפונקציה של | 2|ניתן להניח ש ||>2ולהשתמש בכך שבעץ בינארי עם Lעלים שבו לכל קדקוד פנימי יש שני ילדים ,מספר הקדקודים הכולל הוא ) .O(Lזמן הריצה של strcatקבוע. _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________ ________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 5 שאלה .6( 3נק') על כל אחת מהטענות הבאות כתבו האם היא נכונה או שאינה נכונה .אם הטענה מתקיימת ,הסבירו במדויק מדוע .אם היא אינה מתקיימת ,תנו דוגמה נגדית( .הסעיפים בשאלה זו אינם בונים זה על זה) . א 2להזכירכם ,במימוש תור קדימויות באמצעות ערימה ,כפי שלמדנו בכיתה ,הערימה Pמורכבת משדה גודל ( )P.sizeוממערך המכיל את אברי הערימה (.)P.T ( 5( )1נק') לכל ערימה Pעבורה P.size2ולכל סדרה של אינדקסים 1i1<i2<…<itP.sizeמתקיים ש ].P.T[i1]P.T[i2]…P.T[it _____________________________ ________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ( 5( )2נק') לכל גודל ,n2קיימת סדרה של אינדקסים 1i1<i2<…<it nכאשר ) t=(log nכך שלכל ערימה Pעם nאברים (כלומר ,)P.size=nמתקיים ].P.T[i1]P.T[i2]…P.T[it _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ ________________________________ _____________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 6 ב 0( 2נק') יהי Gגרף עם משקלים על צלעותיו ,יהי w0המשקל המינימאלי של צלע בגרף ,ויהי w1>w0המשקל השני הכי קטן .אם יש רק צלע אחת עם משקל w0ורק צלע אחת עם משקל ( w1אבל ייתכן ומשקלים אחרים מופיעים מספר פעמים) ,אז הצלע עם משקל w1שייכת לכל עץ פורש עם משקל מינימאלי. _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________ ________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ג 0( 2נק' – סעיף מגן (כלומר ,הציון במבחן יהיה המקסימום בין סכום הנקודות על כל הסעיפים ,לבין סכום הנקודות על כל הסעיפים מלבד סעיף זה כפול )(.8800. 2/3 עבור כל מערך קלט Aשבו n>1מספרים שונים ניתן לקבל את n המספרים הקטנים במערך בזמן ).O(n ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _______________________________________________ ______________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 7 שאלה 3.( 1נק') בשאלה זו נרצה לפתור את הבעיה הבאה. הקלט :מספרים שלמים n>1ו ,m>1ומטריצה Aשממדיה ) n x (m+1כאשר שורותיה מתאימות ל 1,…,n ועמודותיה ל 0,…,mוכך שכל כניסה במטריצה היא מספר כלשהו. הפלט :מערך Cבגודל nכך שכל ] C[iהוא מספר שלם אי שליליC[i] m , ]]A[i][C[i n i 1 n i 1 ,ו s( A, C ) גדול ככל האפשר .ראשית נחשב את הערך המרבי של ) s(A,Cואחר כך נמצא C שנותנת ערך שכזה .לשם כך נגדיר ,לכל ,1jnו 0kmאת ) S(j,kלהיות המקסימום של ]]A[i][C[i תחת האילוץ ש C[i] k j i 1 j i 1 ,כאשר כל ] C[iהוא מספר שלם אי-שלילי. א) ( 5נק') איזו מהנוסחאות הבאות מתקיימת לכל 1 < j nו ?0 k mהסבירו את תשובתכם ,כאשר יש להצדיק את הבחירה מפורשות ולא מספיק לפסול שתיים מהאופציות על ידי מתן דוגמאות בהן הן לא מתקיימות. (S ( j, k ) max 0t k S ( j 1, t ) A[ j ][t ] )1 (S ( j, k ) max 0t k S ( j 1, k t ) A[ j ][k ] )2 (S ( j, k ) max 0t k S ( j 1, k t ) A[ j ][t ] )3 _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________ ________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 8 ב) ( .6נק') כתבו פסאודו-קוד עבור אלגוריתם המקבל כקלט את m ,nו ,Aוהמחזיר כפלט את הערך המרבי של ) . s(A,Cזמן הריצה של האלגוריתם צריך להיות פולינומיאלי ב nו mועליכם לתת חסם עליון טוב ככל האפשר על זמן הריצה של האלגוריתם שלכם 2לא ניתן לכתוב בקוד שורות ביטויים של מקסימום כגון אלו הכתובים בסעיף א' אלא יש לחשב אותם במפורט. _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ __________________________________ ___________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____ ________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________ ________________________________________________________________________________ 9 ג) ( .8נק') הוסיפו פסאודו-קוד לאלגוריתם שכתבתם בסעיף ב ,וכתבו פסאודו-קוד עבור פרוצדורה הנקראת מהאלגוריתם (עליכם להוסיף גם את שורת הקריאה) ,המדפיסה את הערכים ]( C[1],…,C[nלפי הסדר ,מ ]C[1 ועד ] )C[nעבור מערך Cהנותן ערך ) s(A,Cמרבי( .אין צורך למלא את המערך Cהאופטימאלי ,אלא רק להדפיס את הערכים בו ).התוספות לקוד אינן משנות את זמן הריצה של האלגוריתם באופן אסימפטוטי ,וזמן הריצה של הפרוצדורה הנוספת צריך להיות ).O(n __________ ___________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ __________________ ___________________________________________________________________________ _____________________________________________________________________________________________ 11 פתרון מועד ב' סמסטר ב' תשע"ד 1 שאלה זה מתקיים כי אחרת או שהמופע האחרון. הוא איבר רובn/2 +1 אם קיים איבר רוב אז בהכרח האיבר במקום.א בשני המקרים זה נותן. או שהמופע הראשון של איבר הרוב הוא אחרי מקום זה,של איבר הרוב הוא לפני מקום זה while בלולאת ה.maybe_majority האלגוריתם מציב את הערך במקום זה במשתנה.מספר קטן מדי של מופעים ,left ומציב מיקום זה ב,הראשונה הוא מוצא את מיקום המופע הראשון של ערך זה במערך בעזרת חיפוש בינארי בסיום הוא בודק כמה איברים יש.right ומציב ב,ובלולאה השנייה הוא מוצא את מיקום המופע האחרון של ערך זה אחרת,maybe_majority אז מחזירים את הערך של, ואם מספר זה הוא כנדרש מאיבר רוב,right וleft בין .NOT-FOUND מחזירים צריך להשתמש בערך עליון (כפי שמודגש בקוד שלמטה) ולאmid בהצבה ב:בשאלה נפלה טעות בלולאה השנייה .) רוב הסטודנטים לא נתקלו כלל בבעיה, מעבר לכך הקוד נשאר כשהיה (ואכן- בערך תחתון ,mid=min כך שmax=min+1 השימוש בערך תחתון גרם לכך שהלולאה עלולה לא להיעצר כי מגיעים למצב בו .max וmin ונשארים עם אותם ערכים של Majority_Sorted(A,n) { pos := n/2 +1 maybe_majority := A[pos] /* if A contains majority value, then must occur in A[pos] */ min := 1; max := pos; while (min < max) { /* Invariant of while loop: A[min,…,max] is non-empty and contains leftmost occurrence of maybe_majority */ mid := (min+max)/2 /* setting of mid satisfies min mid < max */ if (A[mid] = maybe_majority) max := mid /* max decreases so that max-min decreases (but is non-negative) */ else min := mid + 1 /* min increases so that max-min decreases (but is non-negative) */ } left := min /* left is leftmost occurrence of maybe_majority in A */ min := pos; max := n while (min < max) { /* Invariant of while loop: A[min,…,max] is non-empty and contains rightmost occurrence of maybe_majority */ mid := (min+max)/2 /* setting of mid satisfies min < mid max */ if (A[mid] = maybe_majority) min := mid /* min increases so that max-min decreases (but is non-negative) */ else max := mid – 1 /* max decreases so that max-min decreases (but is non-negative) */ } right := min /* right is rightmost occurrence of maybe_majority in A */ if (right – left +1 n/2 +1) /* maybe majority is majority value in A */ return( maybe_majority) else return( NOT-FOUND ) } 1 זמן הריצה של הפרוצדורה הוא )) . (log(nהסבר :סך כל הפעולות מחוץ ללולאות ה whileלוקחות זמן קבוע ,וכל איטרציה של כל לולאת whileלוקחת זמן קבוע .נותר אם כן לחסום את מספר האיטרציות של כל אחת מהלולאות. הראשונה מתחילה עם ,min=1, max = n/2+1ובכל איטרציה ההפרש בין minל maxקטן בפקטור ,2כך שיש )) (log(nאיטרציות .באופן דומה ,הלולאה השנייה מתחילה עם min=n/2+1ו ,max=nוגם כן ההפרש קטן בפקטור 2בכל איטרציה. שגיאות נפוצות: היו סטודנטים אשר השלימו את הקוד נכון והסבירו את ההשלמה אך שגו בניתוח זמן הריצה (היו שטענו שזמן הריצה ) (nוהיו שטענו ש )).)(nlog(n 2 ב .עבור המערך הראשון נקבל j*=2ועבור השני .j*=7 ,עבור הראשון ,באיטרציה הראשונה של לולאת ה ,while כיוון ש A[k-j]=A[6]=14שונה מ ,val=A[7]=5אז countיורד מ 1ל j ,0גדל ל ,2ויוצאים מלולאת ה while מיד אחרי איטרציה זו כי .count=0לעומת זאת ,במערך השני ,באיטרציה הראשונה A[k-j]=A[6]=5שזה שווה ל ,valכל ש countגדל ל 2וכמקודם jגדל ל .2באיטרציה הבאה countגדל ל 3ו jל ,3ובבאה countגדל ל 4ו j ל .4בשלוש האיטרציות הבאות ,כיוון שהערכים ב ] A[k-jשונים מ valאזי countקטן בכל אחת מהן ב 1עד שמגיע ל ,1בעוד jממשיך לגדול עד ל 7כך שיוצאים מלולאת ה whileכי .j=k ג .בסיס האינדוקציה .k=1 :במקרה זה האיבר היחיד בתת המערך הוא איבר רוב באופן טריוויאלי (כי )1/2 +1 =1 והוא אכן מוחזר בשורה .1 צעד האינדוקציה .נוכיח שהטענה מתקיימת עבור k>1תחת הנחת האינדוקציה שהיא מתקיימת לכל ,1k’<kכלומר שהפרוצדורה מחזירה את איבר הרוב אם קיים כשה כאשר היא נקראת על תת מערך בגודל קטן ממש מ kוגדול או שווה .1בסיום לולאת ה ,whileלפי עובדה ( ,)1אם j*=kאז valהוא איבר הרוב ב ] A[1,…,kוהא אכן מוחזר, כנדרש .אחרת , j*<k ,ולפי עובדה ( ,)2איבר הרוב ב ] A[1,…,kהוא גם איבר הרוב ב ]* ,A[k-jאבל כיוון ש ( j*>1כי jאותחל ל 1וגדל לפחות ל )2הרי שלפי הנחת האינדוקציה (כי ,1k-j*<kהקריאה ל Majority(A,k- )* jתחזיר את איבר הרוב ב ]* A[1,..,k-jהוא איבר הרוב ב ] ,A[1,…,kכנדרש. שגיאות נפוצות: סטודנטים לא מעטים ניסו להוכיח עבור k+1על בסיס ההנחה שהטענה מתקיימת עבור kאבל זה לא המבנה הנכון של ההוכחה ,כי הקריאה הרקורסיבית מתבצעת על תת מערך קטן יותר בגודל כלשהו (כלומר ,יש להוכיח על ידי אינדוקציה "שלמה" כפי שתואר לעיל) .היו מי שלא השתמשו באחת העובדות (( )1או ( ,))2היו מי שלא דאגו לבסיס האינדוקציה ,והיו מי שהראו הבנה חלקית כלשהי את למעשה לא נתנו הוכחת נכונות (בפרט לא באינדוקציה). ד .זמן הריצה הוא ) ,(nלכל מערך קלט .להלן הסבר .מבנה עץ הרקורסיה הוא שרוך כי יש קריאה רקורסיבית אחת מתוך האלגוריתם .זמן הריצה בכל קריאה (לא כולל הקריאה הרקורסיבית ממנה) ליניארי ב * ,jכלומר במספר האיטרציות של לולאת ה .whileכלומר ,לעץ יש את המבנה הבא: *cj0 כאשר הסכום על ה * jiהוא nכי הקריאה הרקורסיבית ה iהיא על תת המערך בגודל * ji-1יותר קטן מאשר *cj2 תת המערך בקריאה הקודמת .כלומר ,אם נסמן את … הגדלים של תת המערכים בקריאות השונות לאלגוריתם ב ,k0,…,khאז ,k1=k0 – j0* ,k0=n ובאופן כללי( ki = ki-1 – ji-1* ,ו jh*=khכי *cjh האלגוריתם נעצר) ,ולכן הסכום על כל *ji שווה ל .k0=nמכאן שזמן הריצה הכולל ליניארי ב nכפי שנטען. *cj1 שגיאות נפוצות: סטודנטים לא מעטים טענו שזמן הריצה הוא ) .(n2כיוון ש ) n = O(n2הרי שהחסם העליון נכון ,אבל החסם התחתון אינו נכון ,כלומר זמן הריצה אינו ) .(n2בפרט היו שטענו שזהו זמן הריצה על קלט מסוים (לדוגמה ,בו כל המספרים שונים זה מזה) ,וזו טעות. 3 שאלה 2 הקריאה הראשונה נעשית עם pnodeשהוא השורש לעץ ו codewordשהיא מחרוזת ריקה .בקריאות הרקורסיביות קוראים לילדים ,כאשר לילד השמאלי שולחים את המחרוזת המתאימה לקדקוד הנוכחי משורשרת עם ,0ולימני עם 1 (להזכירכם ,לכל קדקוד פנימי בהכרח יש שני ילדים כי הקוד אופטימאלי) .כאשר מגיעים לעלה פשוט מדפיסים את האות המתאימה ואת המילה המתאימה לעלה .זמן הריצה ליניארי במספר הקדקודים ,nכיוון שיש קריאה רקורסיבית אחת בדיוק לכל קדקוד .כיוון שלכל קדקוד בעץ יש שני ילדים הרי שמספר הקדקודים בעץ ליניארי ב |( |מספר העלים) ,ולכן זמן הריצה ליניארי ב |.| )Print-Huff-Code(pnode,codeword { )if (pnode LC = NULL & pnode RC = NULL )Print(pnode LET, codeword { else )if (pnode LC != NULL ))Print-Huff-Code(pnode LC, strcat(codeword, 0 )if (pnode RC != NULL ))Print-Huff-Code(pnode RC, strcat(codeword,1 } } שגיאות נפוצות: .1חלק מהסטודנטים לא התייחסו כלל לשרשור מילת הקוד המצטברת עם 0/1בהתאם לכיוון ההתקדמות. .2רבים התייחסו למשקל הקדקוד למרות שאין משמעות למשקל הקדקוד בזמן מציאת מילת הקוד ,בהינתן עץ בנוי. ישנה משמעות למשקל הקדקוד רק במהלך בניית העץ (ולכן הוזכר שהוא חלק ממבנה הנתונים) .3חלק מהסטודנטים נתנו תנאי עצירה שגוי המתייחס למשקל הקדקוד. 4 שאלה 3 א )1( .הטענה אינה נכונה .לדוגמה ] P.T = [1,3,2היא ערימה חוקית: 1 2 3 אך עבור ,i1=1, i2=2, i3=3הטענה אינה מתקיימת. ( )2הטענה נכונה .אם ניקח ij=2j-1עבור ) j=1,..,log(nאז סדרת האינדקסים הזו מתאימה למסלול בעץ הבינארי הסדור חלקית המוגדר על ידי הערימה מהשורש ועד לעלה ,ולפי תכונות עץ בינארי סדור חלקית ערכים אלו עולים מונוטונית (אינם יורדים) ,ואורך הסדרה כנדרש. שגיאות נפוצות :רבים נתנו את התשובה הנכונה (האם כל טענה נכונה או לא נכונה) אך לא נתנו הסבר או נתנו הסבר שגוי. ב .הטענה נכונה .תהי ) (x,yהצלע (היחידה) עם משקל .w1נניח בשלילה שיש עץ פורש Tעם משקל מינימאלי שלא מכיל צלע זו .כיוון שזהו עץ פורש ,יש מסלול בעץ בין xל .yכיוון ש ) (x,yלא בעץ ,מסלול זה מכיל לפחות שתי צלעות .כיוון שיש רק צלע אחת במשקל ,w0<w1ורק ) (x,yבמשקל ,w1הרי שלפחות אחת הצלעות במסלול, שנסמנה ) (u,vמשקלה גדול ממש מ .w1נוריד צלע זו ,כך שנקבל שני עצים ,באחד xובשני , yועתה נוסיף את הצלע ) (x,yכך שנקבל עץ פורש ’ .Tמשקלו של ’ w(T’) = w(T) – w(u,v) + w(x,y) < w(T) :Tוקיבלנו סתירה למינימאליות משקלו של .T שגיאות נפוצות: . 1לא ניתן להוכיח את הטענה ע"י אלגוריתם ספציפי או שימוש במשפט תנאי מספיק לבטיחות .כל אלו מוכיחים קיום בלבד. .2היו שניסו להוכיח בשלילה אך התייחסו לחתך בהוכחה .אין חתך בהוכחה הזאת בשלילה. ג .הטענה נכונה .נריץ ) Array-to-Heap(A,Pלקבלת ערימה Pובה איברי המערך ,Aונבצע n2/3קריאות ) DeleteMin(Pלקבלת n2/3המספרים הקטנים ביותר .זמן הריצה של Array-to-Heapהוא ) O(nוזמן הריצה של כל קריאה ל DeleteMinהוא )) O(log(nכך שנקבל את זמן הריצה הנדרש. שגיאות נפוצות: רבים ניסו להוכיח את הטענה ע"י אלגוריתם שלא עושה את המבוקש בזמן המבוקש. 5 שאלה 4 א) נוסחה 3היא הנכונה .כיוון ש C[i] k j i 1 כאשר כל ] C[iהוא מספר שלם אי-שלילי ,הרי ש ] C[jיכול להיות מספר של כלשהו tבין 0ל .kלכל בחירה של tבתחום ערכים אלו ,בסכום ]]A[i][C[i j 1 בסכום תורם ] , A[j][tוכיוון ש C[i] k t i 1 j i 1 ,האיבר ה j ,הסכום המרבי של שאר האיברים הוא ) . S(j-1,k-tבביטוי מספר 3אנו לוקחים את הבחירה של tשנותנת מקסימום של סכום שני איברים אלו. ב) (כל השורות המודגשות הן עבור הסעיף הבא). )Min-cost-array(A, n ,m { for (k=0 to m) { /* Initialize the first row of the matrix S */ ]S[1][k] : =A[1][k T[1][k] := k } { )for (j=2 to n { )for (k=0 to m S[j][k] := S[j-1][k] + A[j][0] /* Initialize with choice of t=0 */ T[j[k] := 0 { )for (t=1 to k ]new := S[j-1][k-t] + A[j][t if (new > S[j][k]) { /* new setting of t gives better value */ S[j][k] := new T[j][k] := t } } } } )]return (S[n][m } זמן הריצה O(nm2) :כי האתחול לוקח זמן ) O(mויש בנוסף שלוש לולאות מקוננות ,האחר רצה ) O(nאיטרציות, הבאה ) O(mאיטרציות ,וגם השלישית ) O(mאיטרציות. שגיאות נפוצות: .1לא בוצע איתחול לשורה הראשונה ) .(j=1זה גרם לכך שבלולאה המרכזית (אשר רצה מ )j=1הייתה גישה ל ] S[0][kשלא מוגדר (אכן ניתן היה לחילופין להוסיף שורה 0ולאתחל אותה). .2האיתחול של ]( S[j][kאו של משתנה maxשבסוף מוצב ב ] )S[j][kלא היה נכון .בפרט ,סטודנטים רבים איתחלו אותו ל ( 0והיו שאיתחלו ל )-1אבל כיוון שאין כל הנחה על הערכים ב ( Aלא נאמר שהם אי שליליים) אז איתחול זה שגוי. .3היו סטודנטים שהחזירו ערך לא נכון. .4היו סטודנטים שהחלק המרכזי של האלגוריתם (הלולאות בהם מחשבים את ערכי )Sהיה שגוי והיו כמה שניסו שניסו לכתוב שילוב בין מימוש איטרטיבי ) (bottom-upומימוש רקורסיבי עם זיכרון ).(memorization 6 ג) נוסיף לקוד של סעיף ב מספר שורות אשר ימלאו עבור כל j,kאת אותו tהנותן את המקסימום בביטוי מסעיף א. כלומר נמלא מטריצה Tכך ש , T [ j ][k ] arg max 0t k S[ j 1][k t ] A[ j ][t ]ובמקום )] return(S[n][mנקרא ל ) .Print_Best(n,m,Tזמן הריצה של הפרוצדורה מסעיף ב לא גדל אסימפטוטית (כי הוספנו מספר קבוע של פעולות בכל לולאה) .זמן הריצה של הפרוצדורה ( Print_Bestכאשר היא נקראת עם )j=n,k=mהוא ) O(nכי בכל קריאה רקורסיבית jקטן ב ,1כאשר הוא מתחיל ב nונעצר כש ,j=1וזמן הריצה של כל קריאה (לא כולל קריאות רקורסיביות ממנה) ,קבוע. )Print_Best(j,k,T { )if (j=1 )print(k { else )Print_Best(j-1, k-T[j][k],T )]print(T[j][k { } שגיאות נפוצות: .1היו סטודנטים שמילאו נכון (או כמעט נכון) את המטריצה Tאך מעבר לכך לא כתבו פתרון נכון. .2היו סטודנטים שניסו למלא מערך חד מימדי ,Cכאשר במקום השורה T[j][k]:=tשהוספנו לקוד בסעיף ב ,הם הוסיפו ,C[j]:=tואז הם הדפיסו את .Cזה שגוי כי ב ] C[jיהיה תמיד ]( T[j][mכי mהוא הערך האחרון של k בלולאה) ,וזה לא נותן פתרון נכון. 7 ת"ז: אוניברסיטת תל-אביב הפקולטה להנדסה מועד א' סמסטר ב' תשע"ד במבני נתונים ואלגוריתמים זמן המבחן :שלוש שעות תאריך02.6.02.4 : מרצה :דנה רון הנחיות: מותר להשתמש בארבעה דפי עזר .אין להשתמש בשום סוג של מחשב. המבחן כולל 4שאלות .הניקוד על כל שאלה מופיע בסוגריים. כתבו את תשובותיכם על גבי טופס המבחן במקום המוקצה לכך .מומלץ מאוד לכתוב תחילה את התשובה במחברת הטיוטה שקיבלתם ורק אחר כך להעתיק אותה ,בצורה ברורה וקריאה ,לטופס המבחן. נמקו בקצרה אך בבהירות את כל טענותיכם .טענה ללא נימוק לא תתקבל. מותר להשתמש במשפטים ואלגוריתמים שנלמדו בשיעורים ובתרגולים או שהופיעו בתרגילי הבית. במקרה כזה ניתן לצטט את מה שנלמד ללא צורך בהוכחה .לעומת זאת ,אם אתם משתמשים בגרסה שונה מעט של אלגוריתם או ניתוח כלשהו יש להסביר במדויק מה ההבדלים. במבחן זה 11עמודים (כולל עמוד זה) .אנא ודאו שכולם ברשותכם. אל תשכחו לרשום מספר ת"ז במקום המסומן. ב ה צ ל ח ה! 1 שאלה 02( .נק') א .0( .נק') יהי Algהאלגוריתם הרקורסיבי הבא ,המקבל כקלט מערך Aשל nמספרים ושני אינדקסים .pr )Alg(A,p,r { )if (p=r )return(0 q = (p+r)/2 num := 0 )for (i = p to q )for (j = q+1 to r )]if (A[i] > A[j num := num+1 ))return(num + Alg(A,p,q) + Alg(A,q+1,r } מה מחזיר האלגוריתם כאשר הוא נקרא עם ?p=1,r=nהסבירו בבירור את תשובתכם. ________________ _____________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ qt 1 . i 0 q מהו ) g(nכך שזמן הריצה של האלגוריתם הוא )) ? (g(nבמידה ותזדקקו לכך ,נזכיר כי q 1 i t ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ________________________ _____________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ 2 ב .8( .נק') נתון האלגוריתם הבא כאשר Partitionו MergeSortהם כפי שלמדנו בכיתה. QMS(A,n,k,p,r) /* A is an array of size n, k<n/2, and 1 p,r n */ { ) if (r –p +1 n-k )MergeSort(A,p,r } else )q := Partition(A,p,r )QMS(A,n,k,p,q )QMS(A,n,k,q+1,r } } נסמן את זמן הריצה של QMSכאשר היא נקראת עם r=n p=1ו k<n/2ב ) .TQMS(n,kבשאלה זו עליכם לנתח מהו ) g(n,kכך ש )) ,TQMS(n,k) = (g(n,kלפי השלבים הבאים: ( )1תארו (בציור) את מבנה עץ הרקורסיה של האלגוריתם (כאשר העלים של העץ מתאימים לקריאות ל .)MergeSortהשתמשו בכך ש ( k<n/2חישבו כיצד זה משפיע על מבנה העץ ,לכל מערך קלט Aבגודל .)n _____________________________________________________________________________________________ ___________________________ __________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ___________________________________ __________________________________________________________ ( )2תנו חסם עליון (מנומק) על גובה העץ. _____________________________________________________________________________________________ _____________________________________________________________________________________________ __________________________ ___________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 3 ( )3תנו חסם עליון (מנומק) על התרומה הכוללת של העלים (המתאימים לקריאות ל .)MergeSort _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ( )4תנו חסם עליון (מנומק) על התרומה הכוללת של הקדקודים הפנימיים. _____________________________________________________________________________________________ _____________________________________________________________________________________________ ______________________________________________ _______________________________________________ _____________________________________________________________________________________________ ( )5כתבו במפורש מהו החסם העליון שקיבלתם והראו שחסם זה הדוק ,כלומר ,שהוא גם חסם תחתון (על זמן הריצה במקרה הגרוע). _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ 4 שאלה .1( 0נק') נתון עץ בינארי עם משקלים על צלעותיו .כלומר ,כל קדקוד הוא רשומה עם השדות הבאים ,ID :שהוא שם הקדקוד, PARשהוא מצביע להורה של הקדקוד ,LC ,שהוא מצביע לילד השמאלי של הקדקוד ,ו ,RCשהוא מצביע לילד הימני של הקדקוד (אם אין לקדקוד הורה/ילד ימני /ילד שמאלי אז המצביע המתאים הוא .)NULLבנוסף ,יש שני שדות נוספים WLC :שהוא משקל הצלע בין הקדקוד לילד השמאלי שלו ,ו WRCשהוא משקל הצלע בין הקדקוד לילד הימני שלו (במקרה ואין כזה ילד ,המשקל הוא .)0נאמר שהמשקל המתאים לקדקוד בעץ הוא סכום משקלי הצלעות במסלול מהשורש אליו ,כאשר המשקל של השורש הוא .1המשקלים בעץ יכולים להיות גם שליליים. כתבו פסאודו-קוד עבור פרוצדורה המקבלת מצביע לשורש של העץ ,והמחזירה את המשקל המינימאלי של קדקוד בעץ (אין צורך להחזיר את שם הקדקוד עם משקל זה ,אלא רק את המשקל עצמו) .לדוגמה ,עבור העץ הבא הפרוצדורה תחזיר ( -2המשקל של קדקוד .)d a -1 3 b c -2 -5 e d 2 3 g f הפרוצדורה יכולה לקבל גם פרמטרים נוספים ,ויש לציין מה ערכם כאשר היא נקראת עם מצביע לשורש העץ .מותר לפרוצדורה להשתמש בזיכרון נוסף בגודל קבוע ,אך לא יותר מכך (בפרט ,לא ניתן להשתמש במערך עזר בגודל .)n הוסיפו הערות לצד הפסאודו-קוד ונתחו את זמן הריצה של האלגוריתם שכתבתם כפונקציה של מספר הקדקודים n ,שבעץ .ניתן להניח שהשורש של העץ אינו .NULL _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ _____________________________________________________________________________________ 5 שאלה 04( 0נק' ( 8נק' לכל סעיף)) על כל אחד מהטענות הבאות ענו האם היא נכונה או שאינה נכונה( .הסעיפים אינם בונים זה על זה). א .לכל n>1קיימים גרפים עם nקדקודים ו ) m=(n5/3צלעות כך שזמן הריצה של BFSמכל קדקוד התחלה בגרף הוא ) .(n4/3אם תשובתכם חיובית עליכם לתאר את מבנה הגרפים ,ואם היא שלילית ,עליכם להסביר על בסיס תכונות האלגוריתם ,מדוע לא קיימים כאלו גרפים. ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ __________________________________ ___________________________________________________________ ב .יהי Tעץ 2-3עם לפחות 9עלים .אם מבצעים Deleteלעלה ב Tכך שלכל האבות הקדמונים של העלה בעץ יש שני ילדים ,אז גובה העץ בהכרח יקטן ב .1אם תשובתכם חיובית ,עליכם לנמק מדוע זה נובע מתכונות ,Deleteואם תשובתכם שלילית ,עליכם לתת דוגמה נגדית. _____________________________________________________________________________________________ _____________________________________________________________________________________________ ___________________ __________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ ________________________________________________ _____________________________________ _____________________________________________________________________________________________ 6 ג .תהי Gרשת זרימה ובה לפחות 8קדקודים (כולל sו .)tאם קיים חתך ) ,tT ,sS ,(S,Tכך שיש בדיוק 3 קשתות עם קיבול חיובי החוצות את החתך (כלומר (u,v) ,כך ש vT ,uSו ,)c(u,v)>0אז כאשר אלגוריתם פורד-פלקרסון מסיים את ריצתו ,בהכרח יש לפחות 3קשתות רוויות (כלומר ,עליהן הזרימה שווה לקיבול) .אם תשובתכם חיובית ,עליכם לנמק מדוע זה נובע מתכונות האלגוריתם ,ואם תשובתכם שלילית ,עליכם לתת דוגמה נגדית. _____________________________________________________________________________________________ _____________________________________________________________________________________________ ____________________ _________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ 7 שאלה 0.( 4נק') נתון מערך Aשל nמספרים שונים כאשר המערך Aממוין מקטן לגדול .כמו כן נתון מערך wבגודל nכך ש w[i]>0 הוא המשקל המיוחס למספר ] .A[iעץ חוקי הוא עץ חיפוש בינארי שמכיל את ] A[1],…,A[nבקדקודיו .לכל עץ n חוקי ,Tנגדיר את מחיר העץ ) , c(Tכ ) , c(T ) w[i] (d ( A[i]) 1כאשר )] d(A[iהוא עומק הקדקוד שמכיל i 1 את המספר ]( A[iעומק השורש הוא ,1עומקי ילדיו ,1וכך הלאה) .לדוגמה ,אם ] A=[10,20,30,40,50ו ] w=[1,5,3,2,2אז מחיר העץ 21 11 41 51 הוא 31 5 w[i] (d ( A[i]) 1) 1 2 5 1 3 3 2 2 2 3 26 i 1 בהינתן כקלט מערכים Aו ,wנהיה מעוניינים למצוא עץ (חוקי) Tעם מחיר מינימאלי .בשלב ראשון נתעניין במציאת המחיר המינימאלי של עץ שכזה .לשם כך נגדיר את ] C[i][jלהיות מחיר העץ האופטימאלי המכיל (רק) את האיברים ] .A[i],…,A[jשימו לב שאם i > jאז .C[i][j]=0 א 1( .נק') עבור ,ijאיזו מבין הנוסחאות הבאות מתקיימת? נמקו את תשובתכם בקיצור אך בבהירות. הערה חשובה :אם לא עניתם נכון בסעיף זה כך שתשתמשו בנוסחה לא נכונה בסעיף הבא ,יורדו נקודות רק על סעיף זה ,והסעיף הבא ייבדק כאילו הנוסחה שנבחרה נכונה. j (C[i][ j ] min it j C[i][t 1] C[t 1][ j ] w[ s] )1 s i j (C[i ][ j ] min it j C[i ][t 1] C[t 1][ j ] ( w[ s]) w[t ] )2 si (C[i][ j ] min it j C[i][t 1] C[t 1][ j ] w[t ] )3 _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ______________________________________________ _______________________________________________ _____________________________________________________________________________________________ 8 ב .6( .נק') כתבו פסאודו-קוד עבור אלגוריתם המקבל כקלט את A ,nו wוהמחזיר כפלט את מחיר העץ האופטימאלי עבור Aו .wזמן הריצה של האלגוריתם צריך להיות פולינומיאלי ב nועליכם לתת חסם עליון טוב ככל האפשר על זמן הריצה של האלגוריתם שלכם .לא ניתן לכתוב בקוד שורות ביטויים של מינימום או סכום כגון אלו הכתובים בסעיף א' אלא יש לחשב אותם במפורט. _____________________________ ________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________ ________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ 9 ג .2( .נק') נניח שאנו מעוניינים למצוא לא רק את מחיר העץ האופטימלי ,אלא גם להדפיס את הערכים שבקודקודי העץ האופטימלי במעבר לפי סדר .Preorderלהזכירכם ,במעבר לפי סדר זה קודם מודפס השורש ולאחר מכן הערכים בתת העץ של הילד השמאלי (לפי סדר )Preorderולאחר מכן הערכים בתת העץ של הילד הימני (לפי סדר .)Preorderהוסיפו קוד לאלגוריתם שכתבתם בסעיף הקודם ,והוסיפו פרוצדורה אשר נקראת מהאלגוריתם ואשר מדפיסה את האיברים שבעץ כנדרש .זמן הריצה של האלגוריתם אינו צריך לגדול (אסימפטוטית) .מותר להשתמש בזיכרון נוסף. _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ ________________________________ _____________________________________________________________ _____________________________________________________________________________________________ ________ _____________________________________________________________________________________ ___ __________________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ _____________________________________________________________________________________________ ________________________________________ _____________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ ___________ __________________________________________________________________________________ ________ _____________________________________________________________________________________ ________ _____________________________________________________________________________________ _____________________________________________________________________________________________ 11 פתרון מועד א' סמסטר ב' תשע"ד שאלה 1 א .כאשר הוא נקרא עם , p=1, r=nהאלגוריתם מחזיר את מספר הזוגות ) (i,jכך ש 1i<jnו ].A[i]>A[j הסבר :בהינתן ,p,rאם ,p=rכלומר תת המערך בגודל ,1אז אין זוגות שכאלו ,והאלגוריתם מחזיר 0כנדרש .אחרת ( ,p<rכלומר תת המערך בגודל לפחות ,)1האלגוריתם ,בשתי לולאות ה forהמקוננות ,סופר את מספר הזוגות )(i,j כך ש ,q+1jr ,piqהמקיימים ] A[i]>A[jואחר כך קורא רקורסיבית לחישוב מספר הזוגות ) (i,jכך ש pi<jqו ] A[i]>A[jומספר הזוגות ) (i,jכך ש q+1i<jrו ] .A[i]>A[jביחד מקבלים את כל הזוגות ) (i,jכך ש pi<jrו ] ,A[i]>A[jובפרט זה מתקיים עבור p=1ו ,r=nכפי שנטען לעיל. טעויות נפוצות )1( :רבים מהסטודנטים תיארו במילים את פעולת האלגוריתם אך לא ענו מפורשות מה מחזיר האלגוריתם כאשר נקרא עם )2( .p=1,r=nהיו שענו שהאלגוריתם מחזיר את מספר ההחלפות שיש לבצע על מנת שהמערך יהיה ממוין .אך זה לא מוגדר היטב :מספר ההחלפות המתבצעות על ידי איזה אלגוריתם? אפשר היה לקשור זאת ל Insertion- Sortאם חושבים עליו כאילו הוא מבצע החלפה כל פעם שהוא רואה ערך בתת המערך ] A[1,…,k-1הגדול מ ]( A[kוכך הוא"מחלחל" את ]"A[kבמורד" המערך) ,אך זה אלגוריתם ספציפי. זמן הריצה של האלגוריתם מתואר על ידי נוסחת הנסיגה .T(n) = 2T(n/2)+dn2 :ניתן להפעיל את משפט המסטר: ,f(n)=dn2 ,a=b=2כך ש ,p=1ו ) f(n)=(np+1וכן ) af(n/b)=2d(n/2)2=(1/2)dn2= cf(nעבור ,c<1כנדרש על ידי המקרה השלישי של משפט המסטר ,ומקבלים ).T(n)=(f(n))=(n2 ניתן גם לפתור על ידי תיאור עץ הרקורסיה .זה עץ בינארי שגובהו ) log(nכי בכל רמה הגדלים של תתי המערכים המתאימים לכל קדקוד ברמה קטנים בפקטור .2ברמה iיש 2iקדקודים ,ותרומת כל קדקוד , d(n/2i)2כך שסך כל התרומה של הרמה הוא .dn2/2iבשימוש בהנחיה (סכום של סדרה הנדסית) נקבל שתרומת כל הרמות ביחד היא ).(n2 טעויות נפוצות :היו סטודנטים אשר נתנו נוסחת רקורסיה נכונה ופתרו אותה לפי משפט המאסטר אך לא הסבירו כיצד הפעילו את משפט המסטר .היו שנתנו נוסחה נכונה אך פתרונה היה שגוי .רבים מהסטודנטים תיארו עץ רקורסיה נכון אך נתנו פתרון לא הדוק של ). O(n 2 log n ב )1( .האבחנה המרכזית היא שכיוון ש k<n/2הרי ש ,n-k>n/2ולפי תנאי העצירה של הרקורסיה (הגורם לקריאה ל MergeSortולא להמשך קריאות רקורסיביות לשני חלקים של תת המערך) ,לכל קדקוד פנימי בעץ יש לכל היותר ילד אחד שהוא קדקוד פנימי (כלומר ,מתאים לתת מערך שגודלו יותר מ .)n-kמכאן שצורת העץ היא "מרבה רגליים" ("שרוך עם רגליים") כדלהלן (כאשר העלים מתאימים לקריאות ל :)MergeSort … 1 טעויות נפוצות :סטודנטים רבים לא התייחסו לכך שהתנאי על kכופה את המבנה של עץ הרקורסיה ותיארו מבנה כללי של עץ בינארי .היו גם מי שתיארו את המבנה עבור המקרה הפרטי שבו Partitionמחלקת את המערך לאיבר יחיד ולכל שאר האיברים. ( )2גובה העץ הוא לכל היותר .kזה מתקיים כי לכל קדקוד פנימי ,תתי המערכים שמתאימים לילדיו של הקדקוד קטנים ממש (לפחות באחד) מתת המערך שמתאים לו .כיוון שהשורש מתאים למערך כולו ,שגודלו ,nותתי מערכים בגודל לכל היותר n-kמתאימים לעלים ,הרי שגובה העץ (אורך מרבה הרגליים) הוא לכל היותר .k טעויות נפוצות :סטודנטים רבים נתנו את התשובה ) .O(nאם הנימוק היה נכון ,כלומר היה נימוק נכון לכך שגובה העץ הוא לכל היותר kוכיוון ש k<n/2גובה העץ הוא לכל היותר ,n/2אז על סעיף זה ניתנו מלוא הנקודות (והורדו רק נקודות בשלב הסופי אם הביטוי הסופי לא היה תלוי ב kכפי שדרשנו בשאלה .היו מי שלא נימקו את החסם כראוי. היו גם מי שנתנו תשובות שגויות לחלוטין כדוגמת ) log(nאו ).n/(n-k ( )3כל עלה מתאים לריצת MergeSortעל תת מערך ,כאשר תתי המערכים זרים זה לזה ,וסכום הגדלים שלהם .n אם נסמן את הגדלים שלהם ב n1,n2,…,ntאזי ,לפי מה שידוע לנו על ,MergeSortזמן הריצה הכולל של כל העלים ) ,∑icnilog(ni)∑i cnilog(n)=cn log(nכלומר.O(n log n) , הוא טעויות נפוצות :רבים מהסטודנטים טענו שזמן הריצה הוא )) O((n-k)log(n-kעל בסיס זמן הריצה על העלה המתאים לתת המערך הגדול ביותר (ברמה האחרונה של העץ) מבלי להתייחס לתרומת כל העלים .היו מי שטענו שהעלים האחרים גודלם 1בלי לנמק מדוע זה המקרה שנותן חסם עליון על כל המקרים .אמנם אסימפטוטית זה לא משנה כי , k<n/2אך n אך זה כמובן שגוי ( לדוגמא במקרה בו k=n/2-1ההסבר חסר .היו סטודנטים שטענו שמספר העלים בעץ הוא nk נקבל לפי הנוסחה הזו שהעץ מכיל רק 2עלים). ( )4כל קדקוד פנימי מתאים לריצת Partitionעל תת מערך ,כאשר זמן הריצה של Partitionליניארי בגודל תת המערך .לפי החסם על גובה העץ נקבל ).O(nk טעויות נפוצות :תת סעיף זה בונה על תת סעיף ( )2וכמעט כל הסטודנטים קיבלו עליו את הנקודות בהנחה שציינו נכון את זמן ריצתה של partitionוכפלו זאת בגובה העץ שנתנו בתת-סעיף (.)2 ( )5קיבלנו )) .O(nk+nlog(nכדי לראות שזהו חסם הדוק ,נתבונן במערך ממוין ובו המספרים שונים זה מזה. Partitionברמה ה iתפריד את תת המערך לתת מערך בגודל ,1עליו תתבצע קריאה ל ,MergeSortולתת מערך בגודל .n-i-1התרומה של הקדקודים הפנימיים היא )( cn+c(n-1)+…+c(n-k)>ck(n/2זכרו ש ,)n-k>n/2ותרומת העלים היא לפחות כמו תרומה העלה הרחוק היותר מהשורש ,כלומר לפחות ) ,c(n/2)log(n/2וסך הכל נקבל )) .(nk+n log(nכלומר ,קיבלנו שזמן הריצה הוא )) (g(n,kעבור ).g(n,k) = nk+nlog(n טעויות נפוצות :רבים מהסטודנטים לא הוכיחו חסם תחתון כנדרש -על מנת להראות חסם תחתון יש להראות מערך אשר משיג את זמן הריצה שהראיתם ,ורבים מהסטודנטים לא תיארו מערך כזה. רבים נתנו ביטוי סופי שתלוי רק ב ( nבפרט ,)(n2) ,אך בשאלה נדרשתם במפורש לתת פונקציה ) g(n,kכך שזמן הריצה של האלגוריתם הוא )) ,(g(n,kכלומר נדרשתם לתת במפורש את התלות ב .kבפרט ,שימו לב שאם )k<log(n (לדוגמה ,)k=loglog(n) ,אז זמן הריצה יהיה ).(nlog n 2 2 שאלה (pnode) בשניהם הפרוצדורה מקבל מצביע לקדקוד. הנבדלים בתנאי העצירה,להלן שני פתרונות אפשריים לבעיה אז פשוטNULL אם המצביע אינו, בגרסה הראשונה. (sum) ואת סכום משקלי הצלעות במסלול מהשורש לקדקוד והמשקלים המינימאליים בתתי העצים, שהוא משקל הקדקוד שהגענו אליו,sum מחזירים את המינימום בין המשקל של ילדיו (אותם מקבלים על ידי קריאות רקורסיביות לילדים כאשר למשקל המצטבר מוסיפים את המשקל על הצלע נשים לב שהמשקל, כלומר לילד שאינו קיים,NULL אם הקריאה נעשית עם מצביע שהוא.)המתחברת לכל ילד זה מבטיח. וזה גם הערך המוחזר,(0 (כי כשילד לא קיים אז המשקל על הצלע אליו הואsum+0 המצטבר שנשלח הוא בשביל תשובה נכונה0 ניתן היה למעשה גם להחזיר,0 כיוון שמשקל השורש הוא.שהמינימום עבור ההורה יהיה נכון אם לקדקוד חסר, בגרסה השנייה.)כאשר קוראים לשורש (הגם שלא היה מוחזר בהכרח המשקל הנכון של כל קדקוד . ולכן העצירה תהיה כשמגיעים לעלה,ילד (או שניים) אז הקריאות הרקורסיביות לא מתבצעות ."ישנם פתרונות נוספים אשר אינם שולחים ערך מצטבר לקריאות הרקורסיביות והחישוב נעשה "בחזרה מהרקורסיה .) ניתן היה להשתמש במשתנה גלובאלי לשמירת המינימום (הגם שזה לא הכרחי,כמו כן Min-Weight-ver1(pnode, sum) /* Initially the procedure is called with a pointer to the root of the tree and sum=0 */ { if(pnode = NULL) /* When pnode=NULL, this means that a call was made to a non-existing child. The value returned is the weight of the parent that made the call */ return(sum) else /* Return minimum between weight of node and the minimum weight of nodes in the subtree of the left child and the right child */ return (min(sum, Min-Weight-ver1(pnodeLC, sum+pnodeWLC), Min-Weight-ver1(pnodeRC, sum+pnodeWRC))) } Min-Weight-ver2(pnode,sum) /* Initially the procedure is called with a pointer to the root of the tree and sum=0 */ { min-sum := sum /* initialize min-sum to sum, which is the weight of the node that pnode points to */ if (pnode LC != NULL) { /* Get min weight of node in subtree of left child, and update min-sum if needed */ sum-left := Min-Weight-ver2(pnodeLC,sum+pnodeWLC) if (sum-left < min-sum) min-sum := sum-left } if (pnode RC != NULL) { /* Get min weight of node in subtree of right child, and update min-sum if needed */ sum-right := Min-Weight-ver2(pnodeRC,sum+pnodeWRC) if (sum-right < min-sum) min-sum := sum-right } return(min-sum) } 3 זמן הריצה של כל אחת מהפרוצדורות ליניארי ב nכי מבקרים בכל קדקוד פעם אחת (ובגרסה השנייה גם יש קריאה אחת לכל "ילד חסר" אבל זה רק מגדיל את זמן הריצה פי קבוע) ,וזמן הריצה לכל קדקוד (או ילד חסר) קבוע. טעויות נפוצות .1 :רבים לא התייחסו למקרה שהמשקל המינימאלי הוא של קדקוד פנימי ולאו דווקא של עלה או השורש (כפי שמתקיים בדוגמה שקיבלתם) .הקוד המתקבל הוא מאד פשוט ,אך לא נכון. .2חלק מהסטודנטים לא התייחסו למקרה שלקדקוד עליו מפעילים את הפרוצדורה יש רק ילד אחד ,ולא טיפלו במקרה שמפעילים את הפונקציה על .NULL .3זמן הריצה הוא cnלכל קלט ולא רק לקלט הגרוע ביותר .רבים התייחסו לזמן הריצה כזמן הריצה של הקלט הגרוע ביותר ונתנו את דוגמת ה"שרוך" כדי להפוך להדוק 4 שאלה 3 א .התשובה חיובית .אם הגרף מורכב מ n1/3רכיבי קשירות כאשר בכל רכיב יש n2/3קדקודים וכל קדקוד ברכיב מחובר לכל קדקוד אחר ,אז מספר הצלעות בכל רכיב הוא ) .((n2/3)2)=(n4/3מכאן מקבלים שמספר הצלעות הכולל הוא ) ,m=(n1/3n4/.3)=(n5/3וזמן הריצה מכל קדקוד התחלה הוא ).(n+n4/3)= (n4/3 טעויות נפוצות :רבים ענו שהתשובה שלילית כי זמן הריצה תמיד גדל ליניארית עם מספר הצלעות ,אך זה מתקיים רק כשהגרף קשיר ולא באופן כללי (כפי שהבנייה לעיל מראה). היו שענו שהתשובה חיובית והסבירו מה צריך להתקיים בגרף ,אך לא תיארו את המבנה באופן מלא כנדרש .היו גם שענו שהתשובה חיובית אך הבנייה שנתנו הייתה שגויה ,כך שלא ניתן למעשה נימוק נכון לתשובה. ב .התשובה שלילית .אם לאחד ההורים הקדמונים יש אח עם שלושה ילדים אז תהליך המחיקה ייעצר .לדוגמה ,בעץ: 20 15 17 13 9 11 7 3 5 אם נבצע )( ,Delete(3כאשר 3נמצא אכן בקדקוד של הוריו הקדמונים הם שני ילדים) ,אז לאחר מחיקתו 5 ,ייהפך הילד הקטן של ההורה שלו ,ו 7יעבור להיות הילד השני. שימו לב :הורה קדמון הוא כל קדקוד במסלול בין העלה לשורש (כולל ההורה של העלה). ג .התשובה שלילית .לדוגמה ,להלן רשת עם 8קדקודים שיש בה חתך בין } S={sלשאר הקדקודים שחוצות אותו שלוש קשתות עם קיבול חיובי ,אבל בסיום ריצת האלגוריתם יש רק קשת אחת רוויה( (d,e) ,המתאימה לחתך עם קיבול מינימאלי .)({s,a,b,c,d},{e,f,t}) :להזכירכם ,הסימון x/yמשמעו שהקיבול yוהזרימה ,xואם מופיע רק מספר אחד מעל קשת הרי שהמשמעות היא שזהו הקיבול והזרימה על הקשת היא .0 a 1/2 1/2 t 1/2 f 1/2 e e 1/1 טעויות נפוצות :היו סטודנטים שניסו לשלול את הטענה על ידי רשת שאינה עונה על דרישות השאלה. 5 d 2 2 b b c 2 2 s שאלה 4 א .הנוסחה הנכונה היא הראשונה .בעץ המכיל את האברים ] A[i],…,A[jאחד מהם בשורש .אם זהו ] ,A[tאז ,עומקו 0כך שהוא תורם ] .w[tבתת העץ של הילד השמאלי שלו נמצאים האברים ] A[i],…,A[t-1כאשר העץ האופטימאלי עבורם מחירו ] ,C[i][t-1וכיוון שהעומק של כל קדקוד בעץ ששורשו ] A[tגדול ב 1מהעומק בעץ המכיל את האיברים ] A[i],.,A[t-1הרי שיש להוסיף את סכום המשקלים שלהם .באופן דומה ,בתת העץ של הילד הימני נמצאים האברים ] ,A[t+1],…,A[jתת העץ האופטימאלי עבורם הוא ] C[t+1][jויש להוסיף את משקליהם. הסיבה לכך היא שגובה העץ עם האיברים ] A[i],…,A[jגדול באחד מגובה שני תתי העצים שלו ולכן אם מחיר תת t 1 העץ (השמאלי למשל) הוא ) w[s] (d ( A[s]) 1 ,בעץ המלא s i t 1 t 1 t 1 s i s i s i מחירו ] w[s] (d ( A[s]) 1 1) w[s] (d ( A[s]) 1) w[s .באופן דומה עבור תת העץ הימני .כמו כן ,צריך להוסיף את תרומת השורש .w[t] ,כלומר ,עבור כל ,tהמחיר המינימאלי של עץ ששורשו ] A[tהוא t ] , C[i][t 1] C[t 1][ j ] w[ sוכדי לקבל את העץ האופטימאלי עבור האברים ] A[i],…,A[jניקח את s 1 המינימום על פני כל האפשרויות של בחירת השורש ].A[t ב( .השורה המודגשת היא עבור הסעיף הבא) .באלגוריתם יש שימוש במטריצה ) .(n+1)x(n+1אפשר היה גם להשתמש במטריצה nxnולטפל לחוד במקרים t=i=1ו . t=j=n )Cost(n,A,w { )for (i=1 to n+1 )for (j = 0 to i-1 C[i][j] := 0 /* Actually suffices to initialize C[i][i-1] to 0 for all i */ for (d = 0 to n-1) /* Fill matrix C, diagonal by diagonal */ { )for (i = 1 to n-d j := i+d sum := 0 for (s = i to j) /* Compute w[i]+…+w[j] */ ]sum := sum+w[s C[i][j] := for (t = i to j) { /* Compute cost for opt tree with A[t] in root */ new-cost := C[i][t-1]+C[t+1][j] + sum { )]if (new-cost < C[i][j } C[i][j] := new-cost; T[i][j] := t } } )]return (C[1][n } זמן הריצה של האלגוריתם הוא ) .O(n3ראשית יש אתחול שרץ בזמן ) .O(n2אחר כך יש שתי לולאות זו בתוך זו כאשר כל אחת רצה לכל היותר nאיטרציות (האחת על dוהשניה על ,)iובתוך הפנימית יש עוד שתי לולאות שכאלו אחת אחרי השנייה (האחת על sוהשנייה על .)t 6 טעויות נפוצות: טעות משמעותית אחת הייתה לבצע את החישוב לפי סדר שגוי ,כלומר שלא מקיים את התנאי שכאשר מחשבים את ] C[i][jאז ] C[i][t-1ו ] C[t+1][jחושבו כבר לכל tבין iלבן .j היו גם בעיות עם אתחול חסר של ] C[i][i-1שגורם לשגיאה בחישוב. היו מעטים שהחזירו ערך לא נכון והיו כמה שטעו בחישוב זמן הריצה או שלא חישבו אותו. ג .נוסיף את השורה המודגשת בקוד של סעיף ב ,כאשר ] T[i][jזהו אותו tבין iל jשנותן את המינימום בביטוי שבסעיף הראשון .כלומר A[T[i][j]] ,הוא השרש האופטימאלי בעץ עבור ]( .A[i],…,A[jשימו לה שעבור זוגות ,i=jכלומר ,כש ,d=0נקבל ).t=i=jכמו כן ,במקום לעשות )] ,return(C[1][nנקרא ל ),Print-Tree(1,n,A,T כאשר Print-Treeהיא הפרוצדורה הבאה. )Print-Tree(i,j,A,T { ]t := T[i][j /* A[t] is in the root of the opt tree for A[i],…,A[j] */ )]Print(A[t )if (t-1 i /* A[t] has a left child (whose subtree contains A[i],…,A[t-1]) */ )Print-Tree(i,t-1,T )if (t+1j /* A[t] has a right child (whose subtree contains A[t+1],…,A[j]) */ )Print_tree)t+1,j,T } טעויות נפוצות :היו סטודנטים לא מעטים שרק מלאו את מטריצת העזר כנדרש אך כתבו פרוצדורה שגויה לגמרי. היו מי שלא דאגו לתנאי עצירה לרקורסיה ,והיו טעויות קטנות יותר בקריאות הרקורסיביות. 7
© Copyright 2024