Test Sol

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

‫מבחן בקורס תכנון וניתוח אלגוריתמים ‪61210 -‬‬

‫מרצה ‪ :‬ד"ר יוליה קמפנר‪ ,‬ד"ר לאוניד קוגל‪ ,‬מר אור כדראוי‬

‫מועד א'‪ ,‬סמסטר ב'‪ ,‬תשע"ח‬


‫תאריך‪13.06.18 :‬‬
‫שאלה ‪ 30( .1‬נקודות )‬

‫האם אפשר למצוא את הסיבוכיות של הפונקציות הבאות ע"י משפט האב ?‬ ‫א‪ 10( .‬נקודות)‬

‫אם לא – נמקו מדוע‪ .‬אם כן – בצעו חישוב מפורט‪.‬‬

‫𝑛‬ ‫‪5𝑛2‬‬
‫‪ 5( .i‬נקודות) 𝑛𝑔𝑜𝑙 ‪𝑇(𝑛) = 9𝑇 ( 3) +‬‬

‫לא ניתן למצוא את הסיבוכיות של נוסחת נסיגה זו בעזרת משפט האב‬

‫‪5𝑛2‬‬
‫= )𝑛(𝑓‬ ‫‪,‬‬ ‫‪𝑛log𝑏 𝑎 = 𝑛log3 9 = 𝑛2‬‬
‫𝑛 ‪log‬‬

‫‪5𝑛2‬‬
‫)‪≠ 𝛰(𝑛2−𝜀 ) ∀ 𝜀 > 0 (𝑐𝑎𝑠𝑒 1‬‬
‫𝑛 ‪log‬‬
‫𝜀𝑛‬
‫‪ .‬אין חסם עליון כאשר ∞ → 𝑛‬ ‫לביטוי‬ ‫‪, 𝜀>0‬‬ ‫נימוק‪ :‬לכל‬
‫𝑛 ‪log‬‬

‫‪5𝑛2‬‬
‫𝑛 ‪log‬‬
‫לכן‪ ,∀𝜀 > 0 ,‬לא קיים ‪ 𝐶 > 0‬כך שלכל ‪ 𝑛 > 𝑛0‬מתקיים 𝜀‪≤ 𝐶𝑛2−‬‬

‫‪5𝑛2‬‬
‫)‪≠ 𝜃(𝑛2 log 𝑘 𝑛) 𝑓𝑜𝑟 𝑘 ≥ 0 (𝑐𝑎𝑠𝑒 2‬‬
‫𝑛 ‪log‬‬

‫‪5𝑛2‬‬
‫)‪≠ Ω(𝑛2+𝜀 ) ∀ 𝜀 < 0 (𝑐𝑎𝑠𝑒 3‬‬
‫𝑛 ‪log‬‬
‫𝑛‬
‫𝑛𝑔𝑜𝑙𝑛 ‪𝑇(𝑛) = 8𝑇 (2) +‬‬ ‫‪ 5( .ii‬נקודות)‬

‫‪𝑓(𝑛) = 𝑛 log 𝑛 ,‬‬ ‫‪𝑛log𝑏 𝑎 = 𝑛log2 8 = 𝑛3‬‬

‫‪𝑛 log 𝑛 = 𝛰(𝑛2 ) = 𝛰(𝑛3−𝜀 ) 𝑓𝑜𝑟 𝜀 = 1‬‬

‫‪⟹ 𝐶𝑎𝑠𝑒 1:‬‬ ‫) ‪𝑇(𝑛) = 𝜃(𝑛log2 8 ) = 𝜃(𝑛3‬‬

‫ב‪ 10( .‬נקודות)‬

‫נתונה מחרוזת‪ReeOuchhey :‬‬


‫קדדו את המחרוזת הנתונה למחרוזת בינארית לפי אלגוריתם הופמן‪ .‬בצעו את כל השלבים‬
‫ותנו הסבר קצר עבור כל שלב‪.‬‬
1 1 1 1 1 2 3

R O u c y h e

2
1 1 1 2 3
1 1
u c y h e
R O

2 2
1 2 3
1 1 1 1
y h e
R O u c

2 2 3
3
1 1 1 1 1 2
e
R O u c y h

4
2 2 3 3

1 1 1 1 1 2
e

R O u c y h
‫‪4‬‬ ‫‪6‬‬

‫‪2‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪3‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪e‬‬

‫‪R‬‬ ‫‪O‬‬ ‫‪u‬‬ ‫‪c‬‬ ‫‪y‬‬ ‫‪h‬‬

‫‪10‬‬

‫‪4‬‬ ‫‪6‬‬

‫‪2‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪3‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪2‬‬


‫‪e‬‬

‫‪R‬‬ ‫‪O‬‬ ‫‪u‬‬ ‫‪c‬‬ ‫‪y‬‬ ‫‪h‬‬

‫לבן ימני ונקבל את‬ ‫ו‪1-‬‬ ‫לבן שמאלי‬ ‫‪0‬‬ ‫נסמן בקשתות העץ הסופי‪:‬‬
‫קידוד האותיות‪:‬‬

‫‪‬‬ ‫‪R = 000‬‬


‫‪‬‬ ‫‪O = 001‬‬
‫‪‬‬ ‫‪u = 010‬‬
‫‪‬‬ ‫‪c = 011‬‬
‫‪‬‬ ‫‪y = 100‬‬
‫‪‬‬ ‫‪h = 101‬‬
‫‪‬‬ ‫‪e = 11‬‬
‫לפיכך‪ ,‬קידוד המחרוזת הנתונה הוא‪:‬‬

‫‪000111100101001110110111100‬‬
‫ג‪ 10( .‬נקודות)‬
‫באלגוריתם ‪ KMP‬למציאת תת מחרוזת בתוך מחרוזת נתונה‪ ,‬השתמשנו במערך עזר‬
‫שמטרתו הייתה לסמן אינדקסים של תחיליות תת המחרוזת‪ .‬למערך זה קראנו ‪. ‬‬
‫האם קיימת מחרוזת ‪ P‬שעבורה במערך ‪ , ‬מופיע המספר ‪ 3‬בדיוק שלוש פעמים ברצף?‬
‫אם לא – נמקו מדוע‪ ,‬אם כן ‪ -‬תנו דוגמא למחרוזת ‪.P‬‬

‫‪:‬‬ ‫ההגדרה של הפונקציה ‪π‬‬


‫אורך ה‪( prefix-‬רישא) הארוכה ביותר שהיא ‪(suffix‬סייפא) של 𝑖𝑃‪.‬‬

‫שעבורה במערך ‪π‬‬ ‫בשאלה‪ ,‬נתבקשתם למצא האם קיימת מחרוזת ‪P‬‬
‫יופיע‪:‬‬

‫‪∃ 𝑖 ≤ |𝑃| − 2 ∶ 𝜋[𝑖] = 𝜋[𝑖 + 1] = 𝜋[𝑖 + 2] = 3‬‬


‫לכן‪ ,‬במחרוזת ‪ P‬צריך להתקיים‬

‫]𝑖[𝑃 = ]‪𝑃[1] = 𝑃[𝑖 − 2], 𝑃[2] = 𝑃[𝑖 − 1], 𝑃[3‬‬


‫&&‬ ‫]‪𝑃[1] = 𝑃[𝑖 − 1], 𝑃[2] = 𝑃[𝑖] , 𝑃[3] = 𝑃[𝑖 + 1‬‬
‫&&‬ ‫]‪𝑃[1] = 𝑃[𝑖] , 𝑃[2] = 𝑃[𝑖 + 1], 𝑃[3] = 𝑃[𝑖 + 2‬‬
‫]‪⟹ 𝑃[1] = 𝑃[2] = 𝑃[3] = 𝑃[𝑖 − 2] = 𝑃[𝑖 − 1] = 𝑃[𝑖] = 𝑃[𝑖 + 1] = 𝑃[𝑖 + 2‬‬

‫דוגמא למחרוזת ‪ P‬מעל הא"ב }‪ {a,b‬עבורה האלגוריתם ‪ KMP‬יבנה‬

‫‪:‬‬ ‫‪3‬‬ ‫המכיל שלוש מופעים רצופים של המספר‬ ‫מערך ‪π‬‬


‫"‪P = "aaabbaaaaaba‬‬
‫]‪ = [012001233341‬‬
‫שאלה ‪ 15 ( .2‬נקודות )‬

‫נתון מערך של מספרים שונים ומספר ‪ x‬שאינו מופיע במערך‪ .‬עליכם לבנות אלגוריתם יעיל‬
‫שמחזיר כמות המינימלית של המספרים שחייבים להוסיף למערך כדי להפוך את החציון שלו ל – ‪x‬‬

‫‪:‬עבור המערך ‪ 10,15,3,8,11,4‬ומספר ‪ x=7‬אנו חייבים להוסיף לפחות שני מספרים‬ ‫לדוגמא‬
‫(למשל ‪ 5‬ו‪ )7 -‬כך ש‪ 7 -‬יהיה החציון‪.‬‬
‫נמקו נכונות וחשבו את הסיבוכיות של האלגוריתם שבניתם‪.‬‬

‫) ‪int Min_numbers_for_Median( A, x‬‬


‫|‪{ n |A‬‬
‫‪m  0‬‬
‫‪For i1 to n‬‬
‫‪If‬‬ ‫)‪(A[i] < x‬‬
‫‪Then‬‬ ‫‪m ++‬‬
‫)‪If (m < n-m‬‬
‫‪Then return‬‬ ‫)‪(n-2*m‬‬
‫)‪Else // If (m >= n-m‬‬
‫‪Then return‬‬ ‫)‪(2*m – n + 1‬‬
‫}‬

‫נכונות וסיבוכיות האלגוריתם‪:‬‬


‫האלג' מונה (ע"י המשתנה ‪ )m‬את כמות המספרים במערך הקטנים בערכם‬
‫מהחציון המיועד‪ .‬זה נעשה בסיבוכיות )𝑛(𝜃 ‪ .‬לפי נתון זה ולפי אורך המערך‬
‫(המשתנה ‪ )n‬האלג' מחשב את כמות המספרים שיש להוסיף (כולל החציון‬
‫עצמו)‪ ,‬תוך הבחנה בין ‪ 3‬מקרים‪.‬‬
‫– יש‬ ‫‪ -‬אם כמות המספרים הקטנים מ‪ x -‬הוא קטן מאלה שגדולים‬
‫הפרש )‪(n-2*m‬‬ ‫להוסיף‬
‫– יש להוסיף ‪ 2*m-n+1‬מספרים‬ ‫‪ -‬אם המצב הפוך‬
‫אם הכמות שווה– יש להוסיף ‪1‬‬ ‫‪-‬‬
‫שאלה ‪ 30 ( .3‬נקודות )‬
‫‪A‬‬ ‫) ‪ . A  (a1 , a2 ,...an‬עליכם למצוא תת‪-‬הסדרה של‬ ‫נתונה סדרת מספרים טבעיים‬
‫עולה ממש עם סכום מקסימאלי ‪.‬‬

‫לדוגמא‪ :‬עבור הסדרה)‪ , A = (13, 1, 7, 1, 12, 5, 2, 1, 3, 4, 5‬תת‪-‬הסדרה המבוקשת היא‪:‬‬

‫)‪𝐵 = (1, 7, 12‬‬

‫בסעיפים הבאים עליכם לבנות אלגוריתם יעיל‪ ,‬מבוסס תכנון דינאמי‪ ,‬למציאת תת הסדרה המבוקשת‪:‬‬

‫לתיאור הבעיה‪.‬‬ ‫עבור האינדקס 𝑛 ≤ 𝑖 ≤ ‪ ,1‬הגדירו פונקציית עזר ) ‪S (i‬‬ ‫א‪.‬‬

‫כולל מקרי בסיס‪ ,‬והסבירו בקצרה מדוע היא נכונה‪.‬‬ ‫נסחו את נוסחת נסיגה עבור ) ‪S (i‬‬
‫פונקציית הע זר מאתרת ושומרת את הסכום של תת סידרה עולה ממש עם‬
‫סכום מקסימאלי המסתיימת באיבר ]‪ . A[i‬נוסחת הנסיגה היא ‪:‬‬

‫]𝑖[𝐴 ‪𝑆(𝑖) = max {𝑆(𝑗)} +‬‬


‫𝑖<𝑗≤‪1‬‬
‫]𝑖[𝐴<]𝑗[𝐴‬

‫ב‪ .‬תארו נוסחה למציאת ערך (סכום מקסימלי של תת‪-‬הסדרה) של פתרון אופטימאלי‪.‬‬
‫ערך הפתרון האופטימאלי הוא המקסימום על כל המערך ‪:S‬‬

‫})𝑖(𝑆{ ‪𝑓(𝑛) = max‬‬


‫𝑛≤𝑖≤‪1‬‬

‫ג‪ .‬בנו אלגוריתם איטראטיבי (לא רקורסיבי) למציאת ערך פתרון אופטימאלי‪ .‬על האלגוריתם‬
‫להשתמש במערך ‪ S‬לאחסון הערכים של הפונקציה ‪ S‬שהגדרתם בסעיף א‪.‬‬
‫האלגוריתם ‪( Find_max_sum_sub_sequenece‬בהמשך)‬
‫ד‪ .‬מהי הסיבוכיות של האלגוריתם שבניתם בסעיף הקודם? נמקו‪.‬‬
‫)‪2‬‬
‫באלג' יש ‪ 2‬לולאות ‪ ,for‬אחת בתוך השניה‪ .‬לכן הסיבוכיות היא 𝑛(𝛰‬
‫ה‪ .‬תנו דוגמא (מלאו טבלה) לעבודת האלגוריתם שבניתם עבור המערך‪:‬‬

‫) ‪A = (13, 1, 7, 1, 12, 5, 2, 1, 3, 4 , 5‬‬


‫)‪S = (13, 1, 8, 1, 𝟐𝟎, 6, 3, 1, 6, 10, 15‬‬
‫ו‪( .‬בונוס‪ :‬תוספת עד ‪ 10‬נק')‬

‫כתבו אלגוריתם המדפיס את הפתרון (תת‪-‬סדרה עולה ממש עם סכום מקסימלי)‪.‬‬


‫) ‪int Find_max_sum_sub_sequenece ( A‬‬
‫‪{ int n  length(A),‬‬
‫]‪S[n‬‬
‫‪For i1 to n‬‬
‫{‬ ‫‪S[i]  0‬‬
‫‪For j1 to i-1‬‬
‫‪If‬‬ ‫)]‪(A[i] > A[j‬‬
‫‪Then if‬‬ ‫)]‪(S[i] < S[j‬‬
‫‪Then‬‬ ‫)]‪(S[i]  S[j‬‬
‫]‪S[i]  S[i]+A[i‬‬
‫}‬
‫)‪Return array_max (S‬‬
‫}‬

‫שאלה ‪ 25 ( .4‬נקודות )‬
‫א‪ 12( .‬נקודות)‬
‫נתון גרף קשיר לא מכוון עם פונקציית משקל על צלעות כך שכל משקלים הם שונים‪.‬‬
‫לגבי גרף זה‪ ,‬הוכיחו (תנו הסבר קצר) או הפריכו (תנו דוגמא נגדית) את המשפטים הבאים‪:‬‬
‫‪ .1‬כל עץ פורש מינימלי מכיל את הצלע עם המשקל המינימאלי‬
‫הוכחה‪ :‬תהי 𝑒 הצלע בעלת המשקל המינימלי בגרף‪ .‬נניח‪ ,‬בשלילה‪ ,‬כי‬
‫קיים עפ"מ ‪ T‬שאינו מכיל את 𝑒‪ .‬אם נוסיף 𝑒 לעפ"מ ‪ T‬נקבל מעגל 𝐶‬
‫נוריד מ‪ C -‬צלע 𝑓 שונה מ‪ 𝑒-‬ונקבל 𝑒 ‪ , 𝑇1 = 𝑇 − 𝑓 +‬אז‬
‫)𝑇(𝑤 < )𝑒(𝑤 ‪𝑤(𝑇1) = 𝑤(𝑇 − 𝑓 + 𝑒) = 𝑤(𝑇) − 𝑤(𝑓) +‬‬
‫כי )𝑒(𝑤 > )𝑓(𝑤‬
‫בסתירה לכך ש 𝑇 הוא עפ"מ‪.‬‬
‫‪ .2‬אף עפ"מ לא מכיל את הצלע עם המשקל המקסימלי‪.‬‬
‫דוגמא מפריכה‪:‬‬

‫‪1‬‬ ‫‪6‬‬
‫‪7‬‬

‫‪2‬‬ ‫‪5‬‬
‫‪G‬‬ ‫‪4‬‬
‫‪3‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬ ‫‪5‬‬
‫‪T‬‬ ‫‪4‬‬
‫‪ .3‬אם עפ"מ מכיל את הצלע עם המשקל המקסימלי אז הצלע הזו היא גשר בגרף‪.‬‬
‫הוכחה‪ :‬תהי 𝑒 הצלע בעלת המשקל המקסימלי בגרף שמוכלת גם‬
‫בעפ"מ‪ .‬נניח‪ ,‬בשלילה‪ ,‬כי 𝑒 אינה משמשת כגשר בגרף‪ .‬כלומר‪𝑒 ,‬‬
‫שייכת למעגל 𝐶 בגרף‪ .‬המעגל 𝐶 נפרש בעפ"מ ע"י הצלעות 𝑇 ∩ 𝐶 ‪.‬‬
‫מתכונת המינימליות של העפ"מ נקבל ש‪-‬‬

‫)𝑓(𝑤 ‪∃𝑓 ∈ 𝐶 − 𝑇: 𝑤(𝐶 ∩ 𝑇) ≤ 𝑤(𝐶 ∩ 𝑇 − 𝑒 + 𝑓) = 𝑤(𝐶 ∩ 𝑇) − 𝑤(𝑒) +‬‬


‫)𝑓(𝑤 ‪⟹ 0 ≤ −𝑤(𝑒) +‬‬
‫)𝑓(𝑤 ≤ )𝑒(𝑤 ⟹‬
‫בסתירה לכך ש 𝑒 היא הצלע בעלת המשקל המקסימלי בגרף‪.‬‬
‫ב‪ 13( .‬נקודות)‬
‫‪ .1‬בהינתן גרף מכוון משוקלל‪ ,‬גם עם משקלים שליליים‪ .‬האלגוריתם של בלמן‪-‬פורד נותן‬
‫תשובה נכונה למסלול הקל ביותר מקדקוד התחלתי ‪ s‬אם אין מעגלים שליליים בגרף‪.‬‬
‫בהינתן שאתם לא יודעים אם יש מעגלים שליליים בגרף‪ ,‬כדי לבדוק אם יש מעגלים‬
‫שליליים מריצים את בלמן‪-‬פורד ‪ n‬פעמים במקום ‪ n-1‬פעמים‪ .‬הסבירו למה‪.‬‬
‫טענה‪ :‬אם בגרף אין מעגלים שלילים שניתן להגיע אליהם מ‪ s-‬אז‬
‫כל מסלול קל ביותר מכיל לכל היותר ‪ n-1‬צלעות‬
‫הוכחה‪ :‬יהי ‪ v‬קדקוד בגרף אליו קיים מסלול מ‪ ,s-‬ויהי ‪P‬המסלול‬
‫הקל ביותר מ‪ s-‬ל‪ .v-‬אם ב‪ P-‬יש מעגל חיובי – עדיף לותר עליו‬
‫בכדי להפחית את משקל המסלול‪ .‬אם ב‪ P-‬יש מעגל ‪ – 0‬אפשר לותר‬
‫עליו כי אינו משפיע על משקל המסלול‪ .‬ואילו מעגל שלילי אין‬
‫מהנחת הטענה‪ .‬לכן‪ ,‬המסלול ‪P‬מכיל לכל היותר ‪ n‬קדקודים שונים‬
‫(כמספר קדקודי הגרף)‪ .‬כלומר‪ ,‬לכל היותר ‪ n-1‬צלעות‪.‬‬

‫אם בגרף אין מעגלים שלילים‪ ,‬לאחר ‪n-1‬‬ ‫לפי הטענה הנ"ל‪,‬‬
‫איטרציות של האלגוריתם‪ ,‬חושב המסלול הקל ביותר מ‪ s-‬לכל‬
‫קודקוד ‪ v‬שיש אליו מסלול‪ .‬לכן‪ ,‬לא יהיה מצב שידרוש פעולת ‪Relax‬‬
‫נוספת‪ .‬ולכן לא יהיה שינוי במערך המרחקים‪.‬‬
‫מאידך‪ ,‬אם יש מעגל שלילי‪ ,‬אז בקודקודים שלאחר מעגל שלילי‬
‫יתקיים בהכרח בשלב ה‪ n-‬האי‪-‬שיוויון )𝑣 ‪ 𝑑[𝑣] > 𝑑[𝑢] + 𝑤(𝑢,‬ותידרש‬
‫פעולת ‪ Relax‬נוספת שתשנה את מערך המרחקים‬
‫לכן‪ ,‬בדיקה האם יש או אין צורך לעשות שינוי במערך המרחקים‬
‫בפעם ה‪ n-‬נותנת אינדיקציה לקיום או אי‪-‬קיום של מעגל שלילי‬
‫בגרף שניתן להגיע אליו מ‪.s-‬‬
‫‪ .2‬מצאו את המשקל ואת המסלול הקל ביותר מקדקוד ‪ s‬לקדקוד ‪ v‬בגרף הבא‪:‬‬
‫המסלול הקל ביותר הוא‪ (s,d,b,a,f,v) :‬ומשקלו ‪17‬‬
‫‪3‬‬ ‫‪10‬‬
‫‪c‬‬
‫‪a‬‬ ‫‪b‬‬ ‫‪-8‬‬
‫‪-7‬‬
‫‪10‬‬ ‫‪1‬‬
‫‪-8‬‬ ‫‪t‬‬
‫‪S‬‬
‫‪7‬‬ ‫‪-2‬‬
‫‪1‬‬
‫‪d‬‬ ‫‪10‬‬ ‫‪f‬‬ ‫‪2‬‬
‫‪13‬‬ ‫‪V‬‬

‫בהצלחה!‬

You might also like