350 likes | 599 Vues
מילון (Dictionary). מילון מאחסן אוסף של רְשׁוּמוֹת מהטיפוס (מפתח, אינפורמציה). המפתח שונה (בד"כ) מרשומה לרשומה. אוסף המפתחות האפשריים מסומן ב- U . לדוגמא: מספרים שלמים. פעולות: אתחול: יצירת מילון ריק. create(D) חיפוש: החזר מצביע לרשומה ב- D שמפתחה x או NULL . find(D,x)
E N D
מילון (Dictionary) מילון מאחסן אוסף של רְשׁוּמוֹת מהטיפוס (מפתח, אינפורמציה). המפתח שונה (בד"כ) מרשומה לרשומה. אוסף המפתחות האפשריים מסומן ב-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
מילון, מבנה חיפוש ועצי חיפוש פעולות נוספות כאשר מוגדר סדר על U (למשל כאשר מפתח הוא מספר): מינימום: החזר את המפתח המינימלי ב-D . עוקב:החזר מצביע לאיבר במילון D בעל המפתח הקטן ביותר שגדול מ- x. min(D) next(D,x) מילון + מינימום + עוקב נקרא = מבנה חיפוש מטרה: לבצע את כל הפעולות בזמן O(log n) (במקרה הגרוע ביותר) כאשר n הוא מספר המפתחות הנמצאים במילון בזמן ביצוע הפעולה. עצי חיפוש: היא משפחה של מימושים למבנה חיפוש. cs,Technion
עץ חיפוש בינרי x y z cs,Technion
Lecture 4 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS סיבוכיות הפעולות: cs,Technion
h(NULL) = -1 דוגמאות לעציAVL
h(NULL) = -1 דוגמאות לעצים שהם לאAVL
טענה 1: T # # = +1 הוכחת טענה 1: באינדוקציה N(T) = # n(T) = # N(T) = N(Tleft) + N(Tright) = n(Tleft)+1 + n(Tright)+1 = n(T)+1
משפט: טענה 1: # # = +1 הגדרה: נסמן ב- Nh מספר מינימאלי של בעץ AVLבגובה≥ h Nh-2<Nh-1 טענה 2:
הגדרה: נסמן ב- Nh מספר מינימאלי של בעץ AVLבגובה ≥ h Nh=Nh-1+Nh-2 טענה 3: שלשה מקרים הוכחת טענה 3: Nh-1 Nh-1 Nh-2Nh-1 Nh-1Nh-2 Nh=min(Nh-1+Nh-2 , Nh-1 +Nh-1) = Nh-1+Nh-2
משפט: טענה 1: # # = +1 הגדרה: נסמן ב- Nh מספר מינימאלי של בעץ AVLבגובה h Nh-2<Nh-1 טענה 2: Nh=Nh-1+Nh-2 טענה 3: Nh> 2h/2 טענה 4:
טענה 4: הוכחת טענה 4: באינדוקציה טענה 3
משפט: טענה 1: # # = +1 טענה 4:
משפט: הוכחנו יהי T עץ AVLבן n צמתים וגובה h, אזי h=2 log (n+1) . מספרי פיבונצ'י
משפחת עצי פיבונצ'יFibonacci trees) ): F0 F1 F2 F3 Fi+1 Fi-1 Fi
לדוגמא: F0 F1 F2 F3 הוכחה: באינדוקציה על i בסיס האינדוקציה: ראינו בתרשים הנחת האינדוקציה:נניח נכונות לכל ij ≤ צעד האינדוקציה: מטענה 2, הנחת האינדוקציה והגדרת מספרי פיבונצ'י, n3=2,n4=3, n5=5, n6=8 ניתוח מספר צמתים בעץ פיבונצ'י טענה: לעץ פיבונאצ'י Fi יש |Fi| = ni+3 - 1 צמתים כאשר ni הוא מספר פיבונצ'י ה-i.
הוכחת הטענה : נתונה המשוואה הבאה. נניח פתרון מהצורה: משוואת ההפרשים ליניארית ולכן כל צרוף ליניארי של פתרונות מהווה פתרון: שימוש בתנאי השפה מוביל למציאת הקבועים: לפיכך פתרון המשוואה (כולל תנאי ההתחלה) הוא: מספרי פיבונצ'י (המשך) נציב במשוואה ונקבל: cs,Technion
18 לאחר הוספת האיבר 18 נתקבל עץ שאינו עץ AVL. אבל נתן לשנות את תת העץ שבו הופר האיזון בצורה הבאה: תיקון כזה נקרא גלגול. 19 20 19 18 20 18 בזמן הוצאה קיימת הפרת איזון דומה. למשל בהוצאת 29. איזון בעץ AVL נובע שזמן החיפוש בעץ AVL הוא O(log n). נצטרך לדאוג שלאחר הכנסה או הוצאה, העץ הנותר יהיה עץ AVL. 12 8 15 24 10 6 14 11 29 20 4 13 19 cs,Technion
בעץ AVL תקין: 1≤|BF(v)| -1 12 2- -1 -1 8 15 2- 0 -1 6 10 24 +1 +1 14 0 2+ 0 +1 0 11 20 29 13 2+ 0 19 1+ 18 אחרי ההכנסה של 18 גורם האיזון מופר על מסלול ההכנסה. איזון בעץ AVL (המשך) עבור צומת v בעץ בינרי נסמן: hL(v) גובה תת העץ השמאלי של v. hR(v) גובה תת העץ הימני של v. גורם האיזון (Balance Factor) מחושב כהפרש הגבהים:BF(v) = hL(v) – hR(v) לדוגמא: מצד שמאל של כל צומת מסומן גורם האיזון. cs,Technion
-1 12 -1 -1 8 15 -1 0 10 +1 +1 6 24 14 0 0 11 0 +1 29 20 13 0 19 אבחנות • הצמתים היחידים שאולי הופר בהם האיזון הם הצמתים לאורך מסלול הכנסה/הוצאה. • אם עבור צומת v במסלול הנ"ל גובה העץ ששורשו v לא השתנה אזי גורמי האיזון בצמתים שמעליו במסלול לא השתנו. • אם גורם האיזון הופך ל-2 או ל 2-, אזי יש לבצע גלגול על מנת שהעץ יחזור להיות עץ AVL. • גורם האיזון לא יכול להיות גדול מ-2 בערכו המוחלט כי בכל הכנסה/הוצאה הוא משתנה ב-1 לכל היותר. • גלגול– פעולה המתבצעת על צומת שהופר בו האיזון על מנת להחזירו לתחום המותר [1 … 1-]. cs,Technion
הצמת האחרון שהופר בו האיזון -2 BF(v) = hL(v) – hR(v) טענה גורם האיזון החדש b לא יכול להיות 0 אם גורם האיזון החדש הוא 0 ונניח האבר נכנס לתת עץ הימני b אזי גורם האיזון הישן היה +1 אזי גובה תת העץ של- b לא השתנה TR TL סתירה h-1 h לכן b=+1 או b=-1 cs,Technion
גלגול LL גלגול LR גלגול RL גלגול RR +2 +2 2- 2- 1- 1+ 1- +1 הגלגול המתאים בבן הימני vR בבן השמאלי vL בשורש v LL BF(v)=2 BF(vL) =1 BF(v)=2 LR BF(vL) = -1 RR BF(vR) = -1 BF(v)= -2 RL BF(vR) = 1 BF(v)= -2 סוגי הגלגולים סוג הגלגול, כלומר הדרך לתקן חוסר איזון בצומת, תלוי בצורה בה האיזון מוּפָר. נתן לסווג חוסר איזון בארבע קטגוריות שונות המכסות את כל המקרים. cs,Technion
0 A אחרי הגלגול: גובה העץ לאחר הגלגול הוא 2+ h, כמו לפני ההכנסה. השורש מאוזן. שינינו (1)O מצביעים ולכן זמן הגלגול (1)O. 0 B h AL AR BR v גלגול LL +2 +1 B לפני הכנסת v : גובה העץ הוא 2+ h. הוכנס צומת v שהגדיל את גובה AL ל-1+h . +1 0 A מצד ימין של הצמתים מסומנים גורמי האיזון שהשתנו. גלגול LL : יעביר את A לשורש h BR h AL AR v h
גלגול LR +1 +2 C -1 0 A +1 0 B h CR h-1 BL BR AL v 0 B גובה העץ אחרי הגלגול הוא 2+h , כמו לפני ההכנסה. שינינו (1)O מצביעים ולכן זמן הגלגול (1)O. A C 0 -1 h-1 BL BR h h AL CR v לפני הכנסת איבר v : הוכנס איבר ל-BL שגרם לו להעלות את גובהו ל-h. גלגול LR:
12 8 15 10 6 24 14 11 4 20 29 13 +1 19 12 18 8 15 10 6 24 14 0 11 4 19 29 13 לאחר גלגול LL: 20 18 דוגמא להכנסת ערך x לעץ AVL הוסף 18: +2 cs,Technion
+2 15 -1 20 10 24 17 6 13 14 4 7 12 11 13 10 15 לאחר גלגול LR: 6 12 14 20 4 7 11 24 17 דוגמא להכנסת ערך x לעץ AVL הוסף 11 :
-2 11 1 8 19 6 10 25 13 29 12 23 17 15 -1 13 11 0 8 19 12 10 25 6 17 29 23 15 דוגמא להכנסת ערך x לעץ AVL הוסף 15 (נחוץ גלגול RL) לאחר גלגול RL:
אלגוריתם להכנסת ערך x לעץ AVL • הכנס את x כמו לעץ חיפוש בינרי. יהי v העלה שהוסף. • h(v) = 0 • כל עוד 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
מציאת המקום הדרוש להכנסה (h)O הוספת הצומת (1)O מציאת המקום בו מופר האיזון (אם מופר) (h)O תיקון האיזון (1)O סה"כ O(h) = O(log n) זמן ההכנסה לעץ AVL כיוון שהצומת בו עושים גלגול לא משנה את גובהו, מבצעים רק גלגול אחד. cs,Technion
אלגוריתם הוצאה • הוצא צומת v כפי שהפעולה מתבצעת בעץ חיפוש בינרי. • תקן את גורמי האיזון בצורה הבאה. לכל צומת v לאורך המסלול • החל מלמטה ועד לשורש בצע: • עדכן אתBF(v) • אם |BF(v)| = 2 , בצע גלגול והמשך כלפי מעלה. • אם גובה תת העץ ששורשו v לא השתנה, סיים. • אם גובה תת העץ השתנה ו-BF(v) תקין, המשך כלפי מעלה. בהוצאה יתכן יותר מגלגול אחד. cs,Technion
-2 5 0 גלגול RL -1 3 8 2 4 6 10 7 9 12 11 0 8 0 גלגול RR 5 10 0 3 6 9 12 2 4 7 11 דוגמא להוצאה מעץ AVL 5 -2 2 8 1 * 4 6 10 3 7 9 12 11 cs,Technion
דוגמא: הוצאה מעץ פיבונצ'י בהוצאה יתכן גלגול בכל צומת על המסלול בין הצומת המוצא ובין השורש. לדוגמא כאשר מוציאים עלה ראשון מעץ פיבונצ'י - Fi. A C * B תרגיל לבית: מהי סדרת הגלגולים המתבצעת כאשר מוציאים עלה ראשון מעץ פיבונצ'י - Fi. cs,Technion
זמן ההוצאה מעץ AVL מציאת המקום הדרוש להוצאה (h)O מציאת המקום בו מופר האיזון (אם מופר) (h)O תיקון האיזון (h)O (לכל היותר פעם בכל רמה) סה"כ O(h) = O(log n) עצי AVL מאפשרים חיפוש, הכנסה, הוצאה בזמן O(log n) cs,Technion
סיבוכיות הפעולות: cs,Technion