שאלת מבחן במבני נתונים ומבוא לאלגוריתמים - האוניברסיטה הפתוחה 2021 - עצי חיפוש
בהינתן שלם חיובי , הציעו מבנה נתונים שבאמצעותו ניתן לבצע את הפעולות הבאות בזמנים הנדרשים ( מציין את מספר האיברים של ):
- : בניית המבנה מתוך סדרה של איברים ממוינים; זמן הריצה:
- : הכנסת איבר חדש בעל המפתח למבנה ; זמן הריצה:
- : מחיקת האיבר שאליו מצביע מהמבנה ; זמן הריצה:
- : מציאת העוקב ה- של האיבר שאליו מצביע ; זמן הריצה:
הסבר: העוקב ה- של איבר נתון ב- מוגדר באופן רקורסיבי: העוקב הראשון הוא העוקב הרגיל; העוקב ה- הוא העוקב הרגיל של העוקב ה-.
הערה: נתון מראש אך אין להתייחס אליו כקבוע בניתוח הזמנים.
- : בניית המבנה מתוך סדרה של איברים ממוינים; זמן הריצה:
- : הכנסת איבר חדש בעל המפתח למבנה ; זמן הריצה:
- : מחיקת האיבר שאליו מצביע מהמבנה ; זמן הריצה:
- : מציאת העוקב ה- של האיבר שאליו מצביע ; זמן הריצה:
הסבר: העוקב ה- של איבר נתון ב- מוגדר באופן רקורסיבי: העוקב הראשון הוא העוקב הרגיל; העוקב ה- הוא העוקב הרגיל של העוקב ה-.
הערה: נתון מראש אך אין להתייחס אליו כקבוע בניתוח הזמנים.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
שאלה חוזרתהאוניברסיטה הפתוחהמבחן סמסטר ב2021 סמסטר ב | 2021 סמסטר ב
★★★★★
עצי חיפושסיבוכיותמבני נתוניםרשימות מקושרות
חשבו על עץ חיפוש בינרי מאוזן (כגון AVL או עץ אדום-שחור), שבו כל צומת מחזיק מצביע נוסף ל-D-SUCCESSOR שלו. בנייה ממערך ממוין אפשרית ב-. עדכון מצביעי ה-D-SUCCESSOR בזמן INSERT/DELETE דורש עדכונים.
המבנה המוצע: עץ חיפוש בינרי מאוזן (AVL / Red-Black Tree) עם שדה נוסף בכל צומת: מצביע לעוקב ה- שלו.
בנוסף, נשמור רשימה מקושרת דו-כיוונית של כל האיברים בסדר ממוין (in-order), כך שלכל צומת יש גם מצביע לעוקב ולקודם ברשימה.
**BUILD():**
הקלט ממוין. בונים עץ AVL מאוזן ממערך ממוין ב- (בנייה רקורסיבית: האמצעי הוא השורש, חצי שמאלי תת-עץ שמאלי, חצי ימני תת-עץ ימני). במקביל בונים את הרשימה המקושרת. לכל צומת , ה- שלו הוא הצומת ה- מקומות קדימה ברשימה – ניתן לחשב זאת בסריקה אחת ב-.
סה"כ: .
**D-SUCCESSOR(, ):**
פשוט מחזירים . זמן: .
**INSERT(, ):**
1. הכנסה רגילה לעץ AVL ב-.
2. מוצאים את העוקב והקודם של ברשימה (זמינים מהעץ) ומכניסים את לרשימה.
3. עדכון מצביעי : יש לעדכן את של הצמתים שלפני ברשימה, ולקבוע את של עצמו. סה"כ עדכונים, כשכל עדכון הוא (הולכים ברשימה).
סה"כ: .
**DELETE(, ):**
1. מחיקה רגילה מעץ AVL ב-.
2. מסירים את מהרשימה המקושרת.
3. עדכון מצביעי : הצמתים שלפני ברשימה צריכים עדכון של ה- שלהם (כל אחד "מקפיץ" מעבר ל-). סה"כ עדכונים.
סה"כ: .
נכונות: כל הפעולות שומרות על תכונות העץ המאוזן, על הרשימה הממוינת, ועל נכונות מצביעי ה-.
בנוסף, נשמור רשימה מקושרת דו-כיוונית של כל האיברים בסדר ממוין (in-order), כך שלכל צומת יש גם מצביע לעוקב ולקודם ברשימה.
**BUILD():**
הקלט ממוין. בונים עץ AVL מאוזן ממערך ממוין ב- (בנייה רקורסיבית: האמצעי הוא השורש, חצי שמאלי תת-עץ שמאלי, חצי ימני תת-עץ ימני). במקביל בונים את הרשימה המקושרת. לכל צומת , ה- שלו הוא הצומת ה- מקומות קדימה ברשימה – ניתן לחשב זאת בסריקה אחת ב-.
סה"כ: .
**D-SUCCESSOR(, ):**
פשוט מחזירים . זמן: .
**INSERT(, ):**
1. הכנסה רגילה לעץ AVL ב-.
2. מוצאים את העוקב והקודם של ברשימה (זמינים מהעץ) ומכניסים את לרשימה.
3. עדכון מצביעי : יש לעדכן את של הצמתים שלפני ברשימה, ולקבוע את של עצמו. סה"כ עדכונים, כשכל עדכון הוא (הולכים ברשימה).
סה"כ: .
**DELETE(, ):**
1. מחיקה רגילה מעץ AVL ב-.
2. מסירים את מהרשימה המקושרת.
3. עדכון מצביעי : הצמתים שלפני ברשימה צריכים עדכון של ה- שלהם (כל אחד "מקפיץ" מעבר ל-). סה"כ עדכונים.
סה"כ: .
נכונות: כל הפעולות שומרות על תכונות העץ המאוזן, על הרשימה הממוינת, ועל נכונות מצביעי ה-.