Transcript Document
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
משפט:
הרעיון הכללי
n+1=N Nh 2
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
h/2
N0 2 2
0/ 2
N1 3 2
:4 הוכחת טענה
באינדוקציה
1/ 2
(h 1)/ 2
Nh =Nh-1 +Nh-2 2
Nh 2
:4 טענה
h/2
3 טענה
(h 2)/ 2
2
1
1
h/2
2
2 2
AVL
:משפט
#
=#
+1
N n 1
Nh 2
h/2
n+1=N Nh 2
h/2
:1 טענה
:4 טענה
h=2(h/2)< 2 log(Nh ) < 2 log(n+1)
AVL
:משפט
הוכחנו
.h=2 log (n+1) אזי,h צמתים וגובהn בןAVL עץT יהי
Nh 2
Nh =Nh-1 +Nh-2
N0 2
h/2
1+ 5
2
Nh =
h+3
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 Nn / log 1.44log 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