Download presentation
Presentation is loading. Please wait.
1
תרגול 6 AVL Trees
2
עצי AVL Height-Balance Property AVL Tree AVL Interface AVL Height
For every internal node v of a tree T, the height of the children nodes of v differ by at most 1. AVL Tree Any binary search tree that satisfies the Height-Balance property. AVL Interface The AVL interface supports the following operations in O(log n) (both average and worst cases): insert, search, delete, maximum, minimum, predecessor and successor. AVL Height Lemma: The height of an AVL tree storing n keys is O(logn)
3
עצי AVL דוגמא של עץ AVL:
4
עצי AVL השוואה לעומת BST או Skip List:
יתרון: גובהו של עץ AVL הוא תמיד O(log n), כלומר כל הפעולות מתבצעות ב- O(log n)במקרה הגרוע חסרון: יותר מסובך למימוש
5
איזון בעץ AVL סיבוב יחיד:
כאשר תכונת איזון הגובה מופרת בהכנסה\הוצאה של קודקוד (נוצר קודקוד שהפרש הגבהים בין שני בניו הוא 2), צריך לאזן את העץ. האיזון נעשה בקודקוד הנמוך ביותר בו מופר האיזון סיבוב יחיד: כאשר חוסר האיזון מצורת או
6
איזון בעץ AVL סיבוב כפול: סיבוב יחיד: הדגמה:
כאשר תכונת איזון הגובה מופרת בהכנסה\הוצאה של קודקוד (נוצר קודקוד שהפרש הגבהים בין שני בניו הוא 2), צריך לאזן את העץ. האיזון נעשה בקודקוד הנמוך ביותר בו מופר האיזון סיבוב כפול: כאשר חוסר האיזון מצורת או את הסיבוב הראשון נבצע מתחת לקודקוד הלא מאוזן, כדי להביא לחוסר איזון מצורת \ סיבוב יחיד: כאשר חוסר האיזון מצורת או הדגמה: 10 15 h=10 h=10 h=11
7
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 חוסר איזון מצורת – סיבוב כפול קודקוד לא מאוזן 10 20 15
8
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 קודקוד לא מאוזן חוסר איזון מצורת – סיבוב כפול 10 15 20
9
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 15 20 10 25 30
10
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 חוסר איזון מצורת – סיבוב יחיד קודקוד לא מאוזן 15 קודקוד לא מאוזן 20 10 25 30
11
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 חוסר איזון מצורת – סיבוב כפול קודקוד לא מאוזן 15 10 25 30 20 16
12
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 חוסר איזון מצורת – סיבוב כפול 10 15 25 30 20 16
13
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 חוסר איזון מצורת – סיבוב יחיד קודקוד לא מאוזן 20 קודקוד לא מאוזן 15 25 קודקוד לא מאוזן 10 30 16 18 19
14
שאלה 2 הכניסו את האיברים הבאים לפי הסדר לעץ AVL (העץ ריק בהתחלה): 10, 20, 15, 25, 30, 16, 18, 19 20 15 25 10 30 18 16 19
15
שאלה 2 כעת הסירו את האיבר 30 חוסר איזון מצורת – סיבוב כפול
חוסר איזון מצורת – סיבוב כפול קודקוד לא מאוזן 20 10 15 25 30 18 19 16
16
שאלה 2 כעת הסירו את האיבר 30 10 25 15 20 18 16 19
17
שאלה 1 קודקוד בעץ בינארי T נקרא בן יחיד אם יש לו קודקוד הורה ואין לו קודקוד אח (השורש אינו בן יחיד) יחס הבדידות של עץ T מוגדר כמספר הבנים היחידים בעץ חלקי מספר כל הקודקודים בעץ 𝐿𝑅(𝑇)= 𝑇ℎ𝑒 𝑛𝑢𝑚𝑏𝑒𝑟 𝑜𝑓 𝑛𝑜𝑑𝑒𝑠 𝑖𝑛 𝑇 𝑡ℎ𝑎𝑡 𝑎𝑟𝑒 𝑜𝑛𝑙𝑦 𝑐ℎ𝑖𝑙𝑑𝑟𝑒𝑛 𝑇ℎ𝑒 𝑛𝑢𝑚𝑏𝑒𝑟 𝑜𝑓 𝑛𝑜𝑑𝑒𝑠 𝑖𝑛 𝑇 הוכיחו כי בכל עץ AVL T מתקיים 𝐿𝑅 𝑇 ≤ 1 2
18
שאלה 1 הוכיחו כי בכל עץ AVL T מתקיים 𝐿𝑅 𝑇 ≤ 1 2 פתרון:
לכל בן יחיד יש קודקוד אבא, ולשני בנים יחידים שונים יש אבות שונים (למה?) מספר הבנים היחידים + האבות שלהם = 2 * מספר הבנים היחידים (למה?) סה"כ מספר הקודקודים בעץ (n) ≤ מספר הבנים היחידים + האבות שלהם = 2 * מספר הבנים היחידים לכן 𝐿𝑅 𝑇 ≤ 1 2
19
שאלה 1 קודקוד בעץ בינארי T נקרא בן יחיד אם יש לו קודקוד הורה ואין לו קודקוד אח (השורש אינו בן יחיד) יחס הבדידות של עץ T מוגדר כמספר הבנים היחידים בעץ חלקי מספר כל הקודקודים בעץ 𝐿𝑅(𝑇)= 𝑇ℎ𝑒 𝑛𝑢𝑚𝑏𝑒𝑟 𝑜𝑓 𝑛𝑜𝑑𝑒𝑠 𝑖𝑛 𝑇 𝑡ℎ𝑎𝑡 𝑎𝑟𝑒 𝑜𝑛𝑙𝑦 𝑐ℎ𝑖𝑙𝑑𝑟𝑒𝑛 𝑇ℎ𝑒 𝑛𝑢𝑚𝑏𝑒𝑟 𝑜𝑓 𝑛𝑜𝑑𝑒𝑠 𝑖𝑛 𝑇 הוכיחו כי בכל עץ AVL T מתקיים 𝐿𝑅 𝑇 ≤ 1 2 האם נכון שלכל עץ בינארי T, אם 𝐿𝑅 𝑇 ≤ אז Height(T)=O(log n)?
20
שאלה 1 האם נכון שלכל עץ בינארי T, אם 𝐿𝑅 𝑇 ≤ 1 2 אז Height(T)=O(log n)?
פתרון: זה לא נכון. זה רק אומר שיש לכל היותר 𝑛 2 בנים יחידים. דוגמאות נגדיות: … עץ מלא בגודל 𝑛 2 𝑛 2 קודקודים
21
שאלה 1 קודקוד בעץ בינארי T נקרא בן יחיד אם יש לו קודקוד הורה ואין לו קודקוד אח (השורש אינו בן יחיד) יחס הבדידות של עץ T מוגדר כמספר הבנים היחידים בעץ חלקי מספר כל הקודקודים בעץ LR(T) = (The number of nodes in T that are only children) / (The number of nodes in T) הוכיחו כי בכל עץ AVL T מתקיים 𝐿𝑅 𝑇 ≤ 1 2 האם נכון שלכל עץ בינארי T, אם 𝐿𝑅 𝑇 ≤ אז Height(T)=O(log n)? האם נכון שבכל עץ בינארי T, אם יש 𝜃 𝑛 בנים יחידים, שכולם עלים, אז Height(T)=O(log n)?
22
שאלה 1 האם נכון שבכל עץ בינארי T, אם יש 𝜃 𝑛 בנים יחידים, שכולם עלים, אז Height(T)=O(log n)? פתרון: זה לא נכון. דוגמה נגדית:
23
שאלה 3 במימוש ל-AVL שלמדתם בכיתה, לכל קודקוד יש שדה נוסף h, ששומר את גובה הקודקוד. בגובה משתמשים בכדי לאזן את העץ. מכיוון שגובה הקודקוד יכול להיות עד log(n), דרושים log(log(n)) ביטים בכל קודקוד לשמירת שדה הגובה. כיצד ניתן להקטין את מספר הביטים שעל כל קודקוד לשמור? במילים אחרות – איך ניתן, ללא שמירת הגובה, לדעת האם וכיצד לאזן את העץ?
24
שאלה 3 כיצד ניתן להקטין את מספר הביטים שעל כל קודקוד לשמור? פתרון:
במקום לשמור את הגובה, כל קודקוד ישמור רק את מצב האיזון שלו – אם תת-העץ השמאלי\ימני גבוה יותר או אם הוא מאוזן 10 ≡ ’/’ - h(x.left) > h(x.right) 00 ≡ ’–‘ - h(x.left) = h(x.right) 01 ≡ ’\’ - h(x.left) < h(x.right)
25
שאלה 3 הדגמה: בצעו הכנסה של האיבר 40. כיצד ישתנו הסמנים? כיצד מזהים היכן יש לבצע סיבוב?
26
שאלה 3 במימוש לAVL- שלמדתם בכיתה, לכל קודקוד יש שדה נוסף h, ששומר את גובה הקודקוד. בגובה משתמשים בכדי לאזן את העץ. מכיוון שגובה הקודקוד יכול להיות עד log(n), דרושים log(log(n)) ביטים בכל קודקוד לשמירת שדה הגובה. כיצד ניתן להקטין את מספר הביטים שעל כל קודקוד לשמור? הציעו דרך למציאת גובה העץ במימוש שהוצע בסעיף 1?
27
שאלה 3 הציעו דרך למציאת גובה העץ במימוש שהוצע בסעיף 1? פתרון:
גובה העץ = העומק המקסימלי של עלה בעץ נרד לעלה העמוק ביותר, ע"י כך שבכל התפצלות נבחר את הצד הגבוה יותר לא תהיה בעיה – אם תת העץ השמאלי לא יותר גבוה, יכולות להיות שתי אפשרויות: יוחזר הגובה בהתאם לתת העץ הימני היותר גבוה, כלומר הקוד תקין שני תתי העצים הם בעלי אותו גובה, לכן לא משנה בהתאם למי יוחזר הגובה מה יקרה אם נוריד את התנאי הזה? Time complexity for height h – O(h) (in the previous representation we got the height of the tree in O(1) and in a regular BST in O(n))
28
שאלה 4 הליכה לפי שלבים מוגדרת כביקור בקודקודים בעץ כך שמבקרים קודם בקודקודים עם עומק נמוך יותר (ובאותו עומק מבקרים משמאל לימין). מהו הסדר של ההליכה לפי שלבים בעץ הבא:
29
שאלה 4 מהו הסדר של ההליכה לפי שלבים בעץ הבא: Answer:
F B H A D G J C E I
30
שאלה 4 הליכה לפי שלבים מוגדרת כביקור בקודקודים בעץ כך שמבקרים קודם בקודקודים עם עומק נמוך יותר (ובאותו עומק מבקרים משמאל לימין). מהו הסדר של ההליכה לפי שלבים בעץ הבא: הציעו אלגוריתם לביצוע הליכה לפי שלבים בעץ בינארי נתון T.
31
שאלה 4 הציעו אלגוריתם לביצוע הליכה לפי שלבים בעץ בינארי נתון T. פתרון:
נשתמש בתור (Queue) של קודקודים: כל עוד המחסנית אינה ריקה, נוציא את הקודקוד הראשון בתור, נדפיס אותו ונכניס את בניו לתור. נתחיל עם תור שמכיל רק את השורש PrintLevelOrder(AVL T) if (T.root ≠ null) Q.enqueue(T.root) while(!Q.isEmpty()) n ← Q.dequeue() print(n.val) if (T.left ≠ null) Q.enqueue(n.left) if (T.right ≠ null) Q.enqueue(n.right) מה יקרה אם נחליף את הסדר של שתי השורות האחרונות? – הדפסת הקודקודים בכל עומק תתרחש מימין לשמאל מה יקרה אם נעביר השורה print(n.val) לסוף? – לא תהיה השפעה על סדר ההדפסה, כלומר לא תהיה השפעה על ריצת האלגוריתם. מה יקרה אם נעביר שורה זו לסוף? מה יקרה אם נחליף בין 2 השורות הללו?
32
שאלה 4 הליכה לפי שלבים מוגדרת כביקור בקודקודים בעץ כך שמבקרים קודם בקודקודים עם עומק נמוך יותר (ובאותו עומק מבקרים משמאל לימין). מהו הסדר של ההליכה לפי שלבים בעץ הבא: הציעו אלגוריתם לביצוע הליכה לפי שלבים בעץ בינארי נתון T. בהינתן עץ AVL חוקי, האם תמיד ניתן לבנות את אותו העץ ע"י פעולות BST של הכנסה ומחיקה של ערכים (ללא סיבובים)?
33
שאלה 4 בהינתן עץ AVL חוקי, האם תמיד ניתן לבנות את אותו העץ ע"י פעולות BST של הכנסה ומחיקה של ערכים (ללא סיבובים)? פתרון: כן, נכניס את האיברים לפי סדר הרמות שלהם. כיצד ניתן לממש את הפקודה הזאת?
34
שאלה 5 הציעו מבנה נתונים שתומך בפעולות הבאות בזמנים הנתונים. הסבירו כיצד מממשים את הפעולות. Init() Initialize the ADT O(1) Insert(x) Insert x into the ADT, if it is not in ADT yet O(log n) Delete(x) Delete x from the ADT, if exists Delete_in_place(i) Delete from the ADT an element, which is in the ith place (as determined by the order of insertion) among the elements that are in the ADT at that moment. Get_place(x) Return the place (which is determined by the order of insertion) of x among the elements that are in the ADT at that moment. If x does not exist, return -1. For example, for the following sequence of actions: Insert(3), Insert(5), Insert(11), Insert(4), Insert(7), Delete(5) Get_place(7) returns 4, and Delete_in_place(2) will delete 11 from the tree.
35
שאלה 5 הציעו מבנה נתונים שתומך בפעולות הבאות בזמנים הנתונים. הסבירו כיצד מממשים את הפעולות. פתרון: נשמור שני עצי AVL, אחד ממוין לפי מפתח (T1), השני ממוין לפי זמן הכנסה (T2). לכל קודקוד יהיה מצביע לקודקוד המקביל בעץ השני. בנוסף, כל קודקוד בעץ T2 (הממוין לפי זמן הכנסה) יכיל שדה של גודל תת-העץ המושרש בו. Example: Delete(5) Insert(3), Insert(5), Insert(11), Insert(4), Insert(7)
36
שאלה 5 הציעו מבנה נתונים שתומך בפעולות הבאות בזמנים הנתונים. הסבירו כיצד מממשים את הפעולות. פתרון: נשמור שני עצי AVL, אחד ממוין לפי מפתח (T1), השני ממוין לפי זמן הכנסה (T2, משתמש במונה count). לכל קודקוד יהיה מצביע לקודקוד המקביל בעץ השני. בנוסף, כל קודקוד בעץ T2 (הממוין לפי זמן הכנסה) יכיל שדה של גודל תת-העץ המושרש בו. Init() – initialize 2 empty trees Insert(x) – insert an element by key into T1, insert the element as the biggest to T2, and update the pointers. In T2 update the field x.size in the insertion path. (The insertion is as in AVL tree) Delete(x) – find the element in T1 (regular search), and delete it from both the trees. In T2, go up from the deleted element to the root and update x.size for all the nodes in this path. (The deletion is as in AVL tree)
37
שאלה 5
38
שאלה 5
39
שאלה 6 פקיד רוצה לשמור רשימה של המטלות שלו. לכל מטלה יש מספר מזהה ייחודי, ולכל מטלה הפקיד מעוניין לשמור האם היא כבר בוצעה או לא. הציעו מבנה נתונים שיבצע עבור הפקיד את הפעולות הבאות בO(log n)- במקרה הגרוע. Insert(k, t) - Insert a new task t with id = k to the data structure, at first mark the task as not completed. Update(k) – Update task with ID = k to be completed. FindDiff(k) – Find the difference between the number of completed and incomplete (| #of_completed – #of_incomplete|) among all the tasks with ID smaller than k.
40
שאלה 6 Insert(k, t) - Insert a new task t with id = k to the data structure, at first mark the task as not completed. Update(k) – Update task with ID = k to be completed. FindDiff(k) – Find the difference between the number of completed and incomplete (| #of completed – #of incomplete|) among all the tasks with ID smaller than k. פתרון: נשתמש בעץ AVL ממויין לפי המספר המזהה, בו כל קודקוד מכיל 2 שדות נוספים – מספר המטלות שבוצעו ולא בוצעו בתת-העץ המושרש בו.
41
שאלה 6 == 0 1
42
שאלה 6
43
שאלות נוספות (אם יש זמן)
מה יהיה שדה ה-size של הקודקודים הבאים בעץ, לאחר הסיבוב? האם ייתכן עץ ה-AVL הבא, לאחר הכנסה (אך לפני הסיבוב)? האם זה ייתכן לאחר מחיקה? האם ייתכן עץ AVL בו יש עלה בעומק 17 ועלה בעומק 31? key=20 size= 16 key=15 size= 24 key=8 size= 7 key=4 size= 3 key=10
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.