1 מילון )(Dictionary AVL מילון מאחסן אוסף של ְרׁשּומֹות מהטיפוס (מפתח ,אינפורמציה). המפתח שונה (בד"כ) מרשומה לרשומה. אוסף המפתחות האפשריים מסומן ב .U-לדוגמא :מספרים שלמים. פעולות: •אתחול :יצירת מילון ריק. )create(D •חיפוש :החזר מצביע לרשומה ב D -שמפתחה xאו .NULL )find(D,x •הוספה :הוסף ל D -רשומה שמפתחה .x )insert(D,x,info •הוצאה :סלק מ D -רשומה שמפתחה .x )delete(D,x כללים: • xשייך לקבוצת המפתחות .U • כל xמופיע לכל היותר פעם אחת במילון (בדר"כ). cs,Technion 2 מילון ,מבנה חיפוש ועצי חיפוש AVL פעולות נוספות כאשר מוגדר סדר על ( Uלמשל כאשר מפתח הוא מספר): מינימום :החזר את המפתח המינימלי ב.D - עוקב :החזר מצביע לאיבר במילון Dבעל המפתח הקטן )min(D )next(D,x ביותר שגדול מ.x - מילון +מינימום +עוקב נקרא = מבנה חיפוש מטרה :לבצע את כל הפעולות בזמן )( O(log nבמקרה הגרוע ביותר) כאשר n הוא מספר המפתחות הנמצאים במילון בזמן ביצוע הפעולה. עצי חיפוש :היא משפחה של מימושים למבנה חיפוש. cs,Technion 3 AVL עץ חיפוש בינרי x y z yxz cs,Technion Lecture 4 of Geiger & Itai’s slide brochure 4 AVL www.cs.technion.ac.il/~dang/courseDS :סיבוכיות הפעולות סיבוכיות cs,Technion function פעולה O(1) create(D) אתחול O(h) find(D,x) חיפוש O(h) insert(D,x,info) הוספה O(h) delete(D,x) הוצאה O(h) → O(1) min(D) O(h) → O(1) next(D,x) מינימום עוקב AVL AVL דוגמאות לעצי h(NULL) = -1 AVL h(NULL) = -1 דוגמאות לעצים שהם לא AVL AVL משפט: הרעיון הכללי h/2 n+1=N N h 2 יהי Tעץ כלשהו בגובה ℎ מספר העלים של העץ מספר הצמתים של העץ מספר מינימלי של עלים בעץ בגובה ℎ AVL :1 טענה T # =# +1 :1 הוכחת טענה באינדוקציה N(T) = # n(T) = # N(T) = N(Tleft) + N(Tright) = n(Tleft)+1 + n(Tright)+1 = n(T)+1 AVL משפט: טענה :1 +1 =# # הגדרה :נסמן ב Nh -מספר מינימאלי של טענה :2 בעץ AVLבגובה ≤ 𝒉 Nh-2 < Nh-1 AVL הגדרה :נסמן ב Nh -מספר טענה :3 בעץ AVLבגובה ≤ h מינימאלי של Nh=Nh-1+Nh-2 הוכחת טענה :3 Nh-1 Nh-2 שלשה מקרים Nh-2 Nh-1 Nh-1 Nh-1 Nh=min(Nh-1+Nh-2 , Nh-1 + Nh-1) = Nh-1+Nh-2 AVL משפט: טענה :1 +1 =# # הגדרה :נסמן ב Nh -מספר בעץ AVLבגובה h מינימאלי של Nh-2 < Nh-1 טענה :2 Nh=Nh-1+Nh-2 טענה :3 טענה :4 Nh> 2h/2 AVL Nh 2 N0 2 2 0/ 2 N1 3 2 :4 טענה :4 הוכחת טענה באינדוקציה 1/ 2 N h =N h-1 +N h-2 2 Nh 2 h/2 h/2 (h 1) / 2 3 טענה 2 (h 2) / 2 1 1 h/2 2 2 2 AVL :משפט # =# N n 1 +1 Nh 2 h/2 n+1=N N h 2 h/2 :1 טענה :4 טענה h=2(h/2) < 2 log(N h ) < 2 log(n+1) AVL :משפט הוכחנו .h=2 log (n+1) אזי,h צמתים וגובהn בןAVL עץT יהי Nh 2 Nh =Nh-1 +Nh-2 1+ 5 2 Nh = h+3 h/2 N0 2 1 5 + 2 5 h+3 N1 3 מספרי פיבונצ'י AVL 1+ 5 2 Nh = Nh h+3 1 5 + 2 5 h 3 נקרא יחס הזהב 5 h+3 1+ 5 2 h log N n / log 1.44 log n AVL :)Fibonacci trees) משפחת עצי פיבונצ'י F0 F1 F2 F3 Fi+1 Fi-1 Fi 17 AVL ניתוח מספר צמתים בעץ פיבונצ'י n0 0, n1 1, n2 1, n3 2, n4 3, n5 5, טענה :לעץ פיבונאצ'י Fiיש |Fi| = ni+3 - 1צמתים כאשר niהוא מספר פיבונצ'י ה.i- באינדוקציה על i הוכחה: לדוגמא: F2 F3 F0 F1 בסיס האינדוקציה :ראינו בתרשים הנחת האינדוקציה :נניח נכונות לכל F j n j 3 1 j ≤ i פיבונצ'י, מספרי האינדוקציה n =2, והגדרת n =3, מטענה ,2nהנחת n =5, צעד האינדוקציה=8 : 6 5 4 3 Fi Fi 1 Fi 2 1 (ni 2 1) (ni 1 1) 1 ni 3 1 18 AVL ניתוח מספר צמתים בעץ פיבונצ'י n0 0, n1 1, n2 1, n3 2, n4 3, n5 5, טענה :לעץ פיבונאצ'י Fiיש |Fi| = ni+3 - 1צמתים כאשר niהוא מספר פיבונצ'י ה.i- הוכחה :באינדוקציה על i בסיס האינדוקציה :ראינו בתרשים הנחת האינדוקציה :נניח נכונות לכל F j n j 3 1 j ≤ i צעד האינדוקציה :מטענה ,2הנחת האינדוקציה והגדרת מספרי פיבונצ'י, Fi Fi 1 Fi 2 1 (ni 2 1) (ni 1 1) 1 ni 3 1 19 AVL מספרי פיבונצ'י (המשך) הוכחת הטענה :נתונה המשוואה הבאה. נניח פתרון מהצורה: נציב במשוואה ונקבל: ni 1 ni ni 1 ni a x i a x i 1 a x i a x i 1 x2 x 1 1 5 1 5 1 5 x1, 2 x1, 2 2 2 2 משוואת ההפרשים ליניארית ולכן כל צרוף ליניארי של פתרונות מהווה פתרון: b b 2 4 ac 2a ni a i b i שימוש בתנאי השפה מוביל למציאת הקבועים: n0 0 a 0 b 0 a b 0 b a 1 5 1 5 1 a 1 a n1 1 a 2 2 5 לפיכך פתרון המשוואה (כולל תנאי ההתחלה) הוא: i i ni 5 cs,Technion 20 AVL איזון בעץ AVL נובע שזמן החיפוש בעץ AVLהוא ) .O(log nנצטרך לדאוג שלאחר הכנסה או הוצאה ,העץ הנותר יהיה עץ .AVL 12 15 24 29 8 10 14 20 13 6 11 4 19 18 לאחר הוספת האיבר 18נתקבל עץ שאינו עץ .AVL אבל נתן לשנות את תת העץ שבו הופר האיזון בצורה הבאה: תיקון כזה נקרא גלגול. בזמן הוצאה קיימת הפרת איזון דומה .למשל בהוצאת .29 19 20 20 18 19 18 cs,Technion 21 AVL איזון בעץ ( AVLהמשך) עבור צומת vבעץ בינרי נסמן: ) hL(vגובה תת העץ השמאלי של .v בעץ AVLתקין|BF(v)|≤1 : ) hR(vגובה תת העץ הימני של .v גורם האיזון ) (Balance Factorמחושב כהפרש הגבהיםBF(v) = hL(v) – hR(v) : לדוגמא: מצד שמאל של כל צומת מסומן גורם האיזון. -2 -1 12 -1 8 -2 -1 15 +1 14 +2 +1 24 0 29 0 13 +2+1 20 -1 10 0 6 0 11 +1 0 19 18 אחרי ההכנסה של 18גורם האיזון מופר על מסלול ההכנסה. cs,Technion 22 AVL אבחנות .1הצמתים היחידים שאולי הופר בהם האיזון הם הצמתים לאורך מסלול הכנסה/הוצאה. .2אם עבור צומת vבמסלול הנ"ל גובה העץ ששורשו vלא השתנה אזי גורמי האיזון בצמתים שמעליו במסלול לא השתנו. .3אם גורם האיזון הופך ל 2-או ל ,-2אזי יש לבצע גלגול על מנת שהעץ יחזור להיות עץ .AVL .4גורם האיזון לא יכול להיות גדול מ 2-בערכו המוחלט כי בכל הכנסה/הוצאה הוא משתנה ב 1-לכל היותר. .5גלגול– פעולה המתבצעת על צומת שהופר בו האיזון על מנת להחזירו לתחום המותר [−1 … 1]. -1 12 -1 15 +1 24 0 29 +1 20 8 -1 10 +1 14 0 19 0 13 -1 0 6 0 11 cs,Technion 23 AVL יהי vהצמת האחרון שהופר בו האיזון טענה גורם האיזון החדש bשל u לא יכול להיות 0 h האבר נכנס לתת העץ הימני של v אם גורם האיזון החדש הוא 0 ונניח האבר נכנס לתת עץ הימני של u אזי גורם האיזון הישן היה +1 אזי גובה תת העץ של u -לא השתנה u b h-1 v -2 )BF(v) = hL(v) – hR(v אזי גורם האיזון של v -לא השתנה TR TL h סתירה לכן b=+1או b=-1 cs,Technion 24 AVL סוגי הגלגולים סוג הגלגול ,כלומר הדרך לתקן חוסר איזון בצומת ,תלוי בצורה בה האיזון מּופָ ר. נתן לסווג חוסר איזון בארבע קטגוריות שונות המכסות את כל המקרים. גלגול RR גלגול RL -2 -1 גלגול LR -2 גלגול LL +2 +2 -1 +1 בבן הימני vR בשורש v בבן השמאלי vL BF(v)=2 BF(vL) =1 LL BF(v)=2 BF(vL) = -1 LR +1 הגלגול המתאים BF(v)= -2 BF(vR) = -1 RR BF(v)= -2 BF(vR) = 1 RL cs,Technion 25 AVL גלגול LL לפני הכנסת :vגובה העץ הוא .h +2 +1 B +2 הוכנס צומת vשהגדיל את גובה ALל.h +1- מצד ימין של הצמתים מסומנים גורמי האיזון שהשתנו. h גלגול : LLיעביר את Aלשורש 0 A +1 BR AR h AL v A 0 אחרי הגלגול: גובה העץ לאחר הגלגול הוא ,h +2כמו לפני ההכנסה .השורש מאוזן .שינינו (O)1 מצביעים ולכן זמן הגלגול (.O)1 B 0 h AL h BR AR v 26 AVL גלגול LR +2 לפני הכנסת איבר :v C +1 -1 +1 h 0 CR הוכנס איבר ל BL-שגרם לו להעלות את גובהו ל.h- BR גלגול :LR CR AL v 0 A -1 C h h-1 BL 0B גובה העץ אחרי הגלגול הוא ,h +2כמו לפני ההכנסה. שינינו ( O)1מצביעים ולכן זמן הגלגול (.O)1 B A 0 BR h-1 BL h v AL 27 AVL דוגמא להכנסת ערך xלעץ AVL הוסף :18 12 8 15 10 24 14 29 13 +2 20 +1 19 6 11 4 12 18 15 24 לאחר גלגול :LL 20 10 14 0 19 29 8 18 13 11 6 4 cs,Technion 28 דוגמא להכנסת ערך xלעץ AVL AVL +2 15 הוסף : 11 20 24 10 17 -1 6 13 14 4 7 12 11 13 15 לאחר גלגול :LR 14 20 24 10 6 12 11 17 7 4 29 דוגמא להכנסת ערך xלעץ AVL הוסף ( 15נחוץ גלגול )RL AVL -2 11 1 19 25 29 8 10 13 6 12 17 23 15 -1 13 לאחר גלגול :RL 11 0 19 25 29 12 10 17 23 8 15 6 30 AVL אלגוריתם להכנסת ערך xלעץ AVL .1הכנס את xכמו לעץ חיפוש בינרי .יהי vהעלה שהוסף. h(v) = 0 .2 .3כל עוד v rootבצע: .4 )p = parent(v .5אם h(p) h(v) +1סיים. .6 h(p) = h(v) +1 .7 אם ב p -הופר האיזון ,בצע גלגול וסיים. .8 אחרת v=p איך נחשב את )? parent(v למשל ,נוציא אותו ממחסנית בה נמצאים כל הצמתים על המסלול מהשורש ועד .v cs,Technion 31 AVL זמן ההכנסה לעץ AVL כיוון שהצומת בו עושים גלגול לא משנה את גובהו, מבצעים רק גלגול אחד. מציאת המקום הדרוש להכנסה (O)h הוספת הצומת (O)1 מציאת המקום בו מופר האיזון (אם מופר) (O)h תיקון האיזון (O)1 סה"כ )O(h) = O(log n cs,Technion 32 AVL אלגוריתם הוצאה • הוצא צומת vכפי שהפעולה מתבצעת בעץ חיפוש בינרי. • תקן את גורמי האיזון בצורה הבאה .לכל צומת vלאורך המסלול החל מלמטה ועד לשורש בצע: • עדכן את )BF(v • אם , |BF(v)| = 2בצע גלגול והמשך כלפי מעלה. • אם גובה תת העץ ששורשו vלא השתנה ,סיים. • אם גובה תת העץ השתנה ו BF(v) -תקין ,המשך כלפי מעלה. בהוצאה יתכן יותר מגלגול אחד. cs,Technion 33 AVL דוגמא להוצאה מעץ AVL 5 8 -1 10 12 -2 0 3 6 9 5 4 2 8 גלגול RL 6 10 2 12 7 7 9 1 4 -2 * 3 11 11 0 8 10 12 5 גלגול RR 0 3 6 9 11 0 7 4 2 cs,Technion 34 AVL דוגמא :הוצאה מעץ פיבונצ'י בהוצאה יתכן גלגול בכל צומת על המסלול בין הצומת המוצא ובין השורש. לדוגמא כאשר מוציאים עלה ראשון מעץ פיבונצ'י .Fi - A C * B תרגיל לבית :מהי סדרת הגלגולים המתבצעת כאשר מוציאים עלה ראשון מעץ פיבונצ'י .Fi - cs,Technion 35 AVL זמן ההוצאה מעץ AVL מציאת המקום הדרוש להוצאה (O)h מציאת המקום בו מופר האיזון (אם מופר) (O)h תיקון האיזון (O)h (לכל היותר פעם בכל רמה) סה"כ )O(h) = O(log n עצי AVLמאפשרים חיפוש ,הכנסה ,הוצאה בזמן )O(log n cs,Technion 36 AVL :סיבוכיות הפעולות סיבוכיות function O(1) create(D) אתחול O(log n) find(D,x) חיפוש O(log n) insert(D,x,info) הוספה O(log n) delete(D,x) הוצאה O(log n) → O(1) min(D) O(log n) → O(1) next(D,x) cs,Technion פעולה מינימום עוקב 37 AVL מידע נוסף בעצי חיפוש בשימושים רבים של עצי חיפוש כדאי לשמור אינפורמציה נוספת בכל צומת .אינפורמציה זו משמשת ְלהֶ אָ צַ ת פעולות נוספות הנדרשות מעצי חיפוש .למשל: הגדרה :האינדקס ) (rankשל מספר 𝑥 בקבוצה 𝑆 הוא מקומו בסדרה ממוינת של איברי 𝑆 .האינדקס של 5בקבוצה } {8,2,7,5הוא .2 בעיה :לממש עץ חיפוש התומך ,בנוסף לפעולות הכנסה/הוצאה/חיפוש ,גם במציאת האינדקס של xבעץ בזמן ) O(heightכאשר heightהוא גובה העץ. בבעיה זו יש לשמור מידע נוסף בעץ החיפוש כדי שנוכל לממש את הפעולות הנוספות ביעילות הנדרשת. אנו ניראה מהו המידע שיש לשמור וכיצד להשתמש בו. אח"כ ניראה כיצד לעדכן את המידע הנוסף כך שהעץ יישאר מאוזן. 38 AVL (Rank Tree) עץ דרגות 16 15 9 8 2 1 6 65 1 3 4 1 1 2 2 3 1 1 1 1 Insert 39 AVL (Rank Tree) עץ דרגות 15 8 z 2 1 6 5 y 3 x 1 1 2 3 1 1 1 1 𝒓𝒂𝒏𝒌(𝒙) 𝑟𝑎𝑛𝑘 = 𝑛 left 𝑥 + 1 For 𝑣 in the path If right 𝑣 in the path then 𝑟𝑎𝑛𝑘 ← 𝑟𝑎𝑛𝑘 + 𝑛 left(𝑣 ) +x1 40 AVL עץ דרגות )(Rank Tree 15 8 z 6 2 1 5 y 3 1 2 1 3 x 1 1 1 עץ דרגות הוא דוגמא למבנה נתונים בו בכל צומת נשמר מידע על תת-העץ שמתחתיו .סוג המידע השמור תלוי בבעיה אותה יש לפתור. 1 41 עץ דרגות מאוזן )(Rank tree בעיה :לממש עץ חיפוש מאוזן התומך במציאת האינדקס ) (rankשל איבר xבזמן )( O(log nכמה צמתים נמצאים לפני xבעץ). פתרון :לדוגמא באמצעות עץ .AVLנשמור בכל צומת ( vמלבד המפתח) את מספר הצמתים בתת-העץ ששורשו .v זיכרו שסימנו מספר זה ב.n(v) - נעדכן את ) n(vבזמן גלגול. AVL עדכון השדה הנוסף בעץ AVL 42 AVL כיצד נעדכן את )𝑣(𝑛? בזמן הכנסה נגדיל את )𝑣(𝑛 באחד לאורך המסלול מהשורש לעלה שהוכנס .בזמן גלגול נעדכן את השדה כנדרש .למשל בגלגול LLנעדכן כך: 𝑛 1 + 𝑛 2 + 𝑛(3) + 2 A 𝑛(𝐵)B 𝑛 2 + 𝑛(3) + 1 B )𝑛(3 BR )𝑛(3 )𝑛(1 )𝑛(2 AR 𝑛(𝐴)A )𝑛(2 AL BR v AR )𝑛(1 h AL v סיבוכיות זמן ה𝑂(log 𝑛) rank - cs,Technion 43 AVL .𝑆 𝑖 בסדרה ממוינת של איברי- 𝑖 בקבוצה 𝑆 הוא האבר ה-( הselect) האבר:הגדרה .7 { הוא8,2,7,5} = 𝑖 בקבוצה3 האיבר השלישי 𝑇 x y z Y Z 𝑌<𝑥<𝑍 𝑆𝑒𝑙𝑒𝑐𝑡(𝑖, 𝑇) If 𝑖 = 𝑛 𝑥 → 𝑙𝑒𝑓𝑡 + 1 then return 𝑇 If 𝑖 < 𝑛 𝑥 → 𝑙𝑒𝑓𝑡 + 1 then return 𝑠𝑒𝑙𝑒𝑐𝑡(𝑖, 𝑇 → 𝑙𝑒𝑓𝑡) If 𝑖 > 𝑛 𝑥 → 𝑙𝑒𝑓𝑡 + 1 then return 𝑠𝑒𝑙𝑒𝑐𝑡(𝑖 − 𝑛 𝑙𝑒𝑓𝑡 𝑥 cs,Technion − 1, 𝑇 → 𝑟𝑖𝑔ℎ𝑡) 44 AVL דוגמא למידע נוסף 100 8 13 5 2 2 79 10 6 6 60 20 9 9 15 cs,Technion 15 25 25 45 AVL דוגמא למידע נוסף 100,9 8 13,3 5 2,1 2 79,5 10 6,1 6 9,1 9 60,3 20 15,1 15 25 25,1 𝑦 𝑥 𝑆𝑢𝑚𝐿𝑒 𝑥 − 𝜖 − 𝑆𝑢𝑚𝐿𝑒 𝑦 + 𝜖 𝑟𝑎𝑛𝑘 𝑥 − 𝜖 − 𝑟𝑎𝑛𝑘 𝑦 + 𝜖 cs,Technion 46 AVL דוגמא נוספת כיצד נעדכן את סכום המפתחות בכל תת-עץ של עץ ? AVL בזמן הכנסה נגדיל את הסכום לאורך המסלול מהשורש לעלה שהוכנס .בזמן גלגול נעדכן את השדה כנדרש .למשל בגלגול LLנעדכן כך: S(A)+S(3)+B A S(B) B )S(B)-S(A)+S(2 B )S(3 BR )S(1 )S(3 )S(2 )S(2 BR AL AR S(A) A v AR )S(1 h AL v תרגיל בית :מהו העדכון בגלגולים האחרים ? כיצד מבצעים זאת עם עץ ? 3-2 cs,Technion
© Copyright 2024