1) איזה סוג של רשימה מקושרת עדיף במקרה הבא:
מאגר עבריינים במשטרה, כאשר יודעים איזה עבריין שייך לכל כנופיה,
וידוע שבכל פעם כשנרצה פרטים על עבריין, נרצה פרטים על כל הכנופייה.
תשובה
תשובה: מכיוון שאיננו רוצים לחפש כל פעם את כל העבריינים בכנופיה בעלות
של (O(N לכל עבריין, נחפש מבנה נתונים שיאפשר חיפוש
ב- (O(N עבור כל העבריינים יחדיו. לצורך זה מלבד העבריינים, שעבור
כל אחד מהם יהיה איבר ברשימה, נשים את כל איברי הכנופיה אחד אחרי
השני, ולפני העבריין הראשון נוסיף איבר נוסף שיציין כנופיה חדשה.
מלבד זאת הרשימה תהיה דו-כיוונית. כשנבצע חיפוש, נמצא קודם את העבריין,
לאחר מכן ננוע אחורה עד לאיבר שמציין: כנופיה חדשה, ולבסוף ננוע
שוב קדימה, תוך החזרת כל העבריינים, עד לכנופיה הבאה.
הסתר תשובה
2) תן דוגמא לתנאים עבורם רשימה מקושרת תהיה עדיפה
על מערך, ולהפך.
תשובה
3) האם רשימה מקושרת הוא מבנה נתונים מתאים אם
נתון שמבנה הנתונים ישמש לצורך חיפוש בלבד?
תשובה
תשובה: לא. היתרון של רשימה מקושרת הוא בכך שכל להוציא
ולהכניס איברים, מכיוון שאין צורך ברציפותם הפיסית בזיכרון. אם נצטרך
חיפוש בלבד יתאים יותר מערך ממוין, וכך עלות החיפוש תהיה (O(LogN
במקום (O(N.
הסתר תשובה
4) הועלתה הצעה: במקום למיין בעזרת Merge Sort
ניתן למיין רשימה, על ידי הפיכתה למערך, אחר-כך לheap, לבצע heap
Sort ולאחר מכן להמיר שוב למערך ולרשימה. איך זה ישפיע על היעילות?
תשובה
תשובה: לא ישפיע. שני סוגי המיונים נעשים ב- (O(LogN,
ואילו כל המעברים נעשים ב- (O(N. ומכוון ש- (O(LogN)
+ 4*O(N) = O(LogN, היעילות זהה.
הסתר תשובה
5) בחברת הפיס יצאו עם משחק חדש. כל אחד יכול
לנחש מספר באינטרנט בין אחד למיליון. לאחר שבוע מגרילים מספר, ובודקים
מי מבין המגלים ניחש נכונה. מה מבנה הנתונים המועדף לצורך זה.
תשובה
תשובה: על-ידי רשימה מקושרת פשוטה נתן לעשות את כל
הפעולות ב- (O(N. הכנסת איבר עולה (O(1,
ולכן הכנסת N המשתתפים תעלה: (O(N. לאחר מכן נרוץ על
כל הרשימה ונחזיר את הזוכים: סה"כ (O(N.
הסתר תשובה
6) האם הפתרון של שאלה 5 הוא בהכרח פתרון אופטימלי?
תשובה
תשובה: לא. במבני נתונים יש תמיד להפריד בין זמן
הבנייה לזמן השימוש. במקרה זה אולי נעדיף לעבוד קשה יותר במהלך השבוע
של בניית מבנה הנתונים כדי לפרסם את שם הזוכה במהירות מקסימלית.
לדוגמא: החזקת מערך ממוין בעלות של (O(N לכל הכנסה,
אך החיפוש עצמו יהיה מהיר בהרבה: (O(LogN במקום (O(N.
לשם השוואה: חיפוש בינארי במאגר של 1,000,000,000 מספרים יעשה ב
30 פעולות. ובמאגר של 1,000,000,000,000 מספרים יעשה ב 40 פעולות.
הסתר תשובה