מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בינסקי הנחיות: יש לענות על כל השאלות. יש לענות על כל שאלה במקום שמיועד לה בגוף השאלון. במקרה הצורך אפשר להשתמש גם בצדו האחורי של הדף. המחברות הן טיוטה בלבד ולא תיבדקנה. הקפידו על כתב מסודר וברור! תשובות ללא הוכחה והסבר לא תקבלנה ניקוד מלא! כשעליכם לכתוב אלגוריתם )פסאדו-קוד(, אם אתם משתמשים במבנה נתונים זהה לחלוטין למה שנלמד בכיתה אפשר להשתמש בו כבקופסא שחורה. אולם, אם אתם משנים משהו במימוש תארו את השינויים במדויק. יש לכתוב אלגוריתמים יעילים ככל האפשר הן מבחינת זמן ריצה והן מבחינת זיכרון. טופס הבחינה כולל 22 עמודים )כולל דף זה ) ב ה צ ל ח ה! 1
דף עזר כללי הלוגריתם:, ויהי n. אז, יהיו כאשר.1.2.3.4.5.6 ( ) סכום סדרה חשבונית: ( ) מסקנה: יהי n, אז ( ) סכום סדרה הנדסית:, ויהי n, אז מסקנה: יהי כאשר סכום סדרה הנדסית אינסופית יורדת: יהי כאשר אז 2
25( שאלה 1 נק'( תור-פרוטקציה PQueue הוא מבנה נתונים התומך בפעולות הרגילות של תור Dequeue( Enqueue, וכו'( ובנוסף בפעולת כניסה לתור בפרוטקציה.PEnqueue() פעולות Dequeue() Enqueue(), שומרות על סדר תור רגיל )הראשון שנכנס הוא הראשון שיוצא(. בנוסף, איבר שנוסף לתור בפעולת PEnqueue() יצא מהתור לפני כל האיברים בתור שנכנסו בפעולת Enqueue() אולם לאחר כל האיברים בתור שנכנסו לפניו בפרוטקציה )איברים שהוכנסו ע"י פעולת.)PEnqueue() לדוגמא, הפלט בעקבות רצף הפעולות הבא )משמאל לימין(: Enqueue(3), Enqueue(4), Enqueue(10), Front, Dequeue, PEnqueue(2006), PEnqueue(2005), Front, Dequeue, Front, Dequeue, Front, Dequeue, Front, Dequeue 3, 2006, 2005, 4, 10 יהיה )משמאל לימין(: תארו במילים ובנוסף הציעו מימוש )בפסאדו-קוד( של מבנה הנתונים תור-פרוטקציה בו יעילות הפעולות PEnqueue() Enqueue(), Dequeue(), הוא (1)O )יש לממש את כל הפעולות המוגדרות על תור!(. הסבירו כל שלב במבנה הנתונים ומדוע הוא עומד בדרישות. PQueue is 3
1) 2) 4
3) 4) 5
5) 6) 6
25( שאלה 2 נק'( בשאלה זו עליכם לכתוב אלגוריתם )פסאדו-קוד( המקבל מערך ממוין של מספרים ומחזיר ערימת מקסימום. Heap CreateHeapFromSortedArray(int arr[], int n); הערות: ערימת המקסימום ממומשת כפי שלמדנו ע"י מערך סטטי ומשתנה המציין את מספר האיברים: Heap is int arr[n]; int heapsize; המערך ממוין מקטן לגדול )האיבר הראשון הוא המינימום( וכל ערך מופיע בו פעם אחת בלבד. ניתן להניח שגודלו הפיסי של המערך הסטטי באמצעותו ממומשת הערימה גדול מספיק בשביל להכיל את כל איברי מערך הקלט )n N(. סעיף א' ממשו את האלגוריתם ונתחו את סדר גודל זמן הריצה של האלגוריתם. Heap CreateHeapFromSortedArray(int arr[], int n) 7
8
סעיף ב' נתחו את זמן הריצה של ביצוע פעולת DeleteMax() אחת על הערימה אשר נוצרה בסעיף א'. 9
סעיף ג' נתחו את זמן הריצה של ביצוע פעולת Insert() אחת על הערימה אשר נוצרה בסעיף א' כאשר בפעולה זו מכניסים אל הערימה נתון אשר קטן ממש מכל הנתונים שנמצאים בערימה. 11
25( שאלה 3 נק'( סעיף א' נתונות ההגדרות הבאות עבור רשימה מקושרת של מספרים שלמים :)int( typedef struct lnode{ int data; struct lnode* next; }LNODE; typedef struct list{ LNODE* head; } LIST; כתבו את הפונקציה: bool iscircular(list lst, LNODE * &inloop); הפונקציה מקבלת רשימה מקושרת של מספרים שלמים lst ומחזירה true אם הרשימה מעגלית וכן כתובת של איבר כלשהו במעגל )בפרמטר הפלט.)inLoop במידה והרשימה איננה מעגלית, הפונקציה תחזיר false ובפרמטר הפלט.NULL הערה: רשימה מעגלית היא רשימה בה אחד האיברים מצביע על איבר כלשהו שקדם לו )לאו דווקא הראשון( ולפיכך נוצר מעגל. לדוגמא, הרשימה הבאה מעגלית: 7 9 1 5 8 11
bool iscircular(list lst, LNODE * &inloop) 12
13
סעיף ב' בהמשך להגדרות הנתונות בסעיף א', כתבו את הפונקציה: LNODE * firstnodeinloop(list lst); הפונקציה מקבלת רשימה של מספרים שלמים lst ומחזירה את הכתובת של האיבר הראשון במעגל במידה והרשימה היא רשימה מעגלית. אחרת, תחזיר הפונקציה.NULL הערות: האיבר הראשון במעגל הינו האיבר עליו מצביעים שני איברים שונים במידה ולא כל איברי הרשימה שייכים למעגל. אחרת, נגדיר את האיבר הראשון ברשימה כאיבר הראשון במעגל. ניתן להשתמש בפונקציה מסעיף א' גם אם לא הצלחתם לממש אותה. לדוגמא, עבור הרשימה המעגלית הבאה הפונקציה תחזיר את הכתובת של האיבר עם הנתון "/": 7 9 1 5 8 LNODE * firstnodeinloop(list lst) 14
15
16
25( שאלה 4 נקודות(: סעיף א' typedef struct tnode{ int data; struct treenode* left; struct treenode* middle; struct treenode* right; }TNODE; נתונות ההגדרות הבאות לייצוג עץ טרינארי: typedef struct tree{ }TREE; TNODE* root; void printonesontree(tree tr); כתבו את הפונקציה: הפונקציה מקבלת כקלט עץ,tr ומדפיסה את הערכים בצמתים שלהם בדיוק בן אחד. למשל, עבור העץ להלן יודפסו הערכים:,9,8 4 אין חשיבות לסדר ההדפסה. 3 5 2 6 9 7 8 23 1 4 17 13 101 17
void printonesontree(tree tr) 18
19
סעיף ב' כתבו נוסחת נסיגה לזמן הריצה של הפונקציה () printonesontree כאשר הפונקציה נקראת Tn ( ) עם עץ שלם בעל n צמתים. שימו לב, עליכם גם להסביר את נוסחת הנסיגה במילים. 21
סעיף ג' פתרו את נוסחת הנסיגה שכתבתם בסעיף הקודם תוך שימוש בשיטת ההצבה. ראשית, העתיקו את נוסחת הנסיגה מהסעיף הקודם: Tn ( ) 21
22