You are on page 1of 8

‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫סיכום הרצאות הקורס מבני נתונים‬

‫)‪Data Structures (67109‬‬


‫על בסיס הרצאותיה של פרופ' דורית אהרונוב‬

‫תשפ"ד ‪ // 2024 //‬סמסטר א'‬

‫הרצאה רביעית – ‪8.2.2024‬‬

‫מחיקת קודקוד ‪ – BST‬אלגוריתם ‪DELETE‬‬

‫עצי ‪AVL‬‬

‫‪1‬‬
‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫א‪ .‬מחיקת קודקוד ‪ – BST‬אלגוריתם ‪:DELETE‬‬

‫במחיקת קודקוד ‪ z‬מעץ חיפוש בינארי ישנם ‪ 3‬מצבים‪:‬‬

‫‪ .1‬לקודקוד ‪ z‬אין ילדים‪ :‬כלומר ‪ z‬עלה‪ .‬פשוט נמחק אותו‪ .‬מבנה ה‪ BST-‬לא השתנה‪.‬‬
‫‪ .2‬לקודקוד ‪ z‬ילד בודד‪ :‬נמחק את הקודקוד ‪ z‬תוך שנחבר את ‪ z.child‬ל‪.z.parent -‬‬
‫כאשר אם ‪ z‬היה בן שמאלי של אביו (‪ )z.parent‬אזי שכעת הבן של קודקוד ‪ z‬יהפוך‬
‫להיות בן שמאלי של קודקוד האב של ‪ ,z‬ולהפך במידה ו‪ z-‬היה בן ימני‪.‬‬
‫‪ .3‬לקודקוד ‪ z‬שני ילדים‪ :‬אם לקודקוד ‪ 2 z‬ילדים‪ ,‬אזי אנחנו יודעים (מהטענה האחרונה‬
‫בסוף שיעור קודם) שהקודקוד העוקב שלו (‪ :successor‬העוקב בעל הערך הקטן‬
‫ביותר מבין ערכי הקודקודים הגדולים מ‪ )z-‬הוא המינימום של תת העץ הימני של ‪.z‬‬
‫היות והוא קודקוד המינימום (בתת) עץ חיפוש בינארי‪ ,‬אזי שאין לו בן שמאלי‪ .‬לכן‬
‫כעת נוכל לחזור ולהשתמש בסעיפים ‪ 1‬ו‪:2-‬‬
‫אם ‪ z.successor‬עלה‪ :‬נחליף בין הערכים שלו לשל הקודקוד ‪ z‬ונמחק אותו‪.‬‬ ‫‪‬‬
‫באופן הזה מבנה ה‪ BST -‬נשמר‪.‬‬
‫אם ‪ z.successor‬בן ימני‪ :‬נחליף את הערכים שלו ושל קודקוד ‪ z‬ונפעל לפי סעיף‬ ‫‪‬‬
‫‪.2‬‬

‫לסיכום‪ :‬באופן הזה כיסינו את כל המקרים האפשריים של מחיקת איבר מ‪ BST-‬תוך שמירה‬
‫על המבנה והתכונות שלו‪.‬‬

‫‪2‬‬
‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫‪3‬‬
‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫ב‪ .‬עצי ‪:AVL‬‬

‫ראינו שפעולות דינמיות שאנחנו יכולים לבצע על עץ חיפוש בינארי עלולות לשנות את גובה‬
‫העץ ולהפוך אותו מגובה לוגריתמי )𝑛𝑔𝑜𝑙(𝜃 = ‪ ℎ‬לגובה לינארי )𝑛(𝜃 = ‪ .ℎ‬ברצוננו להמשיך‬
‫לבצע את הפעולות הללו תוך כדי שמירה על גובה לוגריתמי של העץ‪ .‬אחת הדרכים לכך היא‬
‫בעזרת עצי ‪.AVL‬‬
‫הגדרה‪ :‬עץ ‪ AVL‬הוא עץ חיפוש בינארי המקיים שלכל קודקוד‬
‫)𝑡𝑓𝑒𝑙 ‪ . ℎ 𝑇(𝑥. 𝑟𝑖𝑔ℎ𝑡) − ℎ 𝑇(𝑥.‬כלומר ההפרש בין גובה תת העץ השמאלי לגובה‬ ‫‪≤1‬‬
‫תת העץ הימני של כל קודקוד בעץ הוא לכל היותר ‪ .1‬תנאי זה (נקרא גם גורם האיזון)‬
‫מבטיח לנו שגובה עץ ה‪ AVL-‬יישאר לוגריתמי‪.ℎ = 𝜃(𝑙𝑜𝑔𝑛) :‬‬

‫דוגמא כיצד פעולת ‪ insert‬עלולה‬


‫להשפיע על גובה העץ ‪:BST‬‬

‫טענה‪ :‬עץ ‪ AVL‬הוא עץ מאוזן‪.‬‬

‫נסביר את כיוון החשיבה‪ :‬עץ מאוזן משמע שגובה העץ הוא )𝑛𝑔𝑜𝑙(𝜃 = ‪ .ℎ‬כדי להראות‬
‫זאת‪ ,‬עלינו למצוא קשר בין גובה העץ ‪ h‬לבין מספר הקודקודים בעץ‪ :‬אנחנו נחפש את‬
‫המספר המינימלי של קודקודים שקיים בעץ חיפוש בינארי מסוג ‪ ,AVL‬וכשנראה שהמספר‬
‫המינימלי הזה של קודקודים לא קטן מדי‪ ,‬אז בהכרח יתקיים שה‪ BST-‬הוא מצורה של ‪.AVL‬‬
‫נגדיר את 𝑛 להיות מספר הקודקודים המינימלי בעץ ‪ AVL‬בגובה ‪ .k‬דוגמא עבור ‪:k=4‬‬

‫‪4‬‬
‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫𝑛(‪.‬‬ ‫טענת עזר‪ 𝑛 :‬היא פונקציה מונוטונית עולה ממש‪> 𝑛 ) .‬‬ ‫‪‬‬
‫𝑛‪ .‬היות‬ ‫הוכחה‪ :‬נסתכל על עץ ‪ AVL‬בגובה ‪ k+1‬עם מספר קודקודים מינימלי‬
‫וגובה העץ הוא ‪ k+1‬אזי בהכרח אחד מבניו הוא בגובה ‪( .k‬כאשר השני יכול להיות‬
‫בגובה ‪ k‬או ‪ .)k-1‬נניח בה"כ שגובה תת העץ השמאלי הוא ‪ .k‬ממינימליות העץ כולו‪,‬‬
‫נובע שבתת העץ השמאלי יש בדיוק 𝑛 קודקודים (כי גם הוא מינימלי) ולכן בעץ‬
‫𝑛 כלומר 𝑛‬ ‫המקורי יש לפחות ‪ 𝑛 + 1‬קודקודים‪ .‬מכאן נובע ש 𝑛 > ‪≥ 𝑛 + 1‬‬
‫היא פונקציה מונוטונית עולה ממש‪.‬‬
‫הוכחת הטענה המקורית‪ :‬נמצא נוסחת נסיגה ל‪ .𝑛 -‬נניח בה"כ שגובה תת העץ‬
‫𝑛 קודקודים‪ .‬היות‬ ‫השמאלי הוא ‪ .k-1‬אזי מכאן נובע שבתת העץ השמאלי יש‬
‫)𝑡𝑓𝑒𝑙 ‪ . ℎ 𝑇(𝑥. 𝑟𝑖𝑔ℎ𝑡) − ℎ 𝑇(𝑥.‬לכן‬ ‫וזהו עץ ‪, AVL‬בפרט הוא מקיים ש‪≤ 1 :‬‬
‫גובה תת העץ הימני הוא ‪ k-1‬או ‪ .k-2‬מאחר ומדובר בעץ עם מספר קודקודים‬
‫𝑛‪ ,‬אזי נובע שגובה העץ השמאלי הוא ‪,k-2‬‬ ‫𝑛<‬ ‫מינימלי‪ ,‬ובנוסף מתקיים ש‬
‫(אחרת זה לא היה עץ ‪ AVL‬מינימלי)‪ ,‬וממינימליות העץ כולו‪ ,‬נובע שבתת העץ הימני‬
‫𝑛 קודקודים‪.‬‬ ‫יש‬
‫אם נסכום סה"כ את כמות הקודקודים בתת העץ השמאלי‪ ,‬תת העץ הימני והשורש‪,‬‬
‫𝑛= 𝑛‬ ‫𝑛‪+‬‬ ‫נקבל את נוסחת הנסיגה הבאה עבור 𝑛‪+ 1 :‬‬
‫הנוסחא שקיבלנו היא למעשה נוסחת פיבונצ'י (עד כדי הזזה)‪ .‬אנחנו נרצה לראות‬
‫איך מתנהג ‪ n‬כפונקציה של ‪ .k‬אם נראה ש‪ n-‬גדל אקספוננציאלית ב‪ k-‬אזי זה אומר‬
‫‪𝑛 =1‬‬ ‫שהגובה ‪ k‬הוא לוגריתמי‪.‬‬
‫‪𝑛 =2‬‬ ‫אם כך נוסחת הנסיגה שלנו היא כזו‪:‬‬

‫𝑛= 𝑛‬ ‫𝑛‪+‬‬ ‫‪+1‬‬

‫𝑛 = ‪ .𝑛 + 1‬כלומר‬ ‫𝑛‪+‬‬ ‫נגדיר ‪ 𝑔 = 𝑛 + 1‬ונקבל‪+ 1 :‬‬


‫𝑔 = 𝑔‪ .‬כעת עלינו לפתור את המשוואה‪.‬‬ ‫𝑔‪+‬‬
‫𝑐𝑎 ונקבל‬ ‫𝑐𝑎 = 𝑐𝑎‪ .‬נחלק ב‪-‬‬ ‫𝑐𝑎 ‪+‬‬ ‫"ננחש"‪ .𝑔 = 𝑎𝑐 :‬מכאן נובע ש‪:‬‬
‫√‬ ‫√‬
‫‪.𝜓 = 1 −‬‬ ‫‪ 𝜓 = 1 +‬ו‪-‬‬ ‫ש‪ .𝑐 = 𝑐 + 1 :‬כלומר 𝜓𝑏 ‪ 𝑔 = 𝑎𝜓 +‬כאשר‬

‫נשים לב ש‪.|𝜓 | < 1 :‬‬


‫נציב ‪ ,𝑔 = 𝑎𝜓 + 𝑏𝜓 = 3 ,𝑔 = 𝑎 + 𝑏 = 2‬ונקבל ש‪:‬‬
‫(‬ ‫)‬
‫𝐹 = 𝑔 ומכאן ש 𝜓𝜃 = 𝑔 = 𝑛 כלומר עבור קבוע ‪D‬‬ ‫=‬
‫√‬

‫כלשהו מתקיים ש‪:‬‬

‫‪5‬‬
‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫)𝑛𝑔𝑜𝑙(𝑂 = 𝑘 ⇒ ) 𝑛𝑔𝑜𝑙(𝑂 = 𝑘 ⇒ ) 𝜓(𝑔𝑜𝑙𝑘 ‪𝑛 ≥ 𝐷𝜓 ⇒ log(𝑛 ) ≥ log(𝐷) +‬‬

‫עבור עץ חיפוש בינארי ‪.AVL‬‬

‫הכנסת איבר לעצי ‪:AVL‬‬

‫)𝑡𝑓𝑒𝑙 ‪ . ℎ 𝑇(𝑥. 𝑟𝑖𝑔ℎ𝑡) − ℎ 𝑇(𝑥.‬אנחנו‬ ‫תזכורת‪ :‬גורם האיזון בעצי ‪ AVL‬הוא ‪≤ 1‬‬
‫מעוניינים להכניס קודקוד חדשים לעצי ‪ ,AVL‬כך שימשיכו לקיים את גורם האיזון‪ ,‬כלומר‬
‫יישארו עצי חיפוש בינארי מסוג ‪ .AVL‬לאחר הכנסת איבר נעלה מעלה אל שורש העץ ובכל‬
‫קודקוד בדרך נתקן את הגובה‪ .‬נבדוק את גורם האיזון בכל שלב‪ ,‬וכשניתקל בהפרה – נעצור‪.‬‬
‫קיימים שלושה מקרים בעת הכנסת קודקוד לעץ ‪:AVL‬‬

‫‪ .1‬רוטציית ‪ :LL‬נניח והכנסנו קודקוד בתחתית הקצה השמאלי של העץ 𝐴 ‪ ,‬התחלנו‬


‫לעלות כלפי מעלה לכיוון השורש‪ ,‬ועצרנו בקודקוד ‪ – B‬הקודקוד הראשון שמפר את‬
‫תכונת גורם האיזון‪ .‬נסמן את הגובה של 𝐵 ב‪ ,h-‬אזי מכאן נובע שהגובה של תת‬
‫העץ 𝐴 הוא ‪ .h‬אנחנו מעוניינים לתקן את שגיאה זו‪ .‬נבצע רוטצייתצ ‪ LL‬באופן הבא‪:‬‬

‫ביצוע הרוטציה הנ"ל היא בסיבוכיות זמן של )‪ ,O(1‬מכיוון שאנו משנים מצביעים למספר‬
‫קבוע של קודקודים בעץ‪ .‬בנוסף לאחר הרוטציה מתקיימים התנאים הבאים‪:‬‬

‫א‪ .‬גובה העץ ששורשו ‪ B‬לא השתנה‬


‫ב‪ .‬תנאי עץ חיפוש בינארי ‪ BST‬נשמרים‬
‫ג‪ .‬תנאי ‪ AVL‬נשמרים‬
‫‪ .2‬רוטציית ‪ :RR‬זהה לרוטציית ‪ LL‬אך בהיפוך מראה‪.‬‬

‫‪6‬‬
‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫‪ .3‬רוטציית ‪ :LR‬נניח וההפרה הראשונה מתרחשת בקודקוד ‪:C‬‬

‫נפריד את הרוטציה לשתי רוטציות נפרדות‪ :‬רוטציית ‪ RR‬ב‪ ,A-‬ולאחריה רוטציית ‪ LL‬ב‪.C-‬‬

‫גם כאן – ‪ 3‬התנאים הבאים נשמרים‪:‬‬

‫א‪ .‬גובה העץ ששורשו ‪ B‬לא השתנה‬


‫ב‪ .‬תנאי עץ חיפוש בינארי ‪ BST‬נשמרים‬
‫ג‪ .‬תנאי ‪ AVL‬נשמרים‬

‫‪7‬‬
‫מבני נתונים (‪ // )67109‬פרופ' דורית אהרונוב ‪ //‬תשפ"ד ‪ //‬סמסטר א' ‪ //‬הרצאה חמישית‬

‫‪8‬‬

You might also like