Lecture3 of Geiger & Itai’s slide brochure trees www.cs.technion.ac.il/~dang/courseDS עצים ועצי חיפוש חומר קריאה לשיעור זה Chapter 5.5– Trees (91 – 97) Chapter 13– Binary Search.
Download
Report
Transcript Lecture3 of Geiger & Itai’s slide brochure trees www.cs.technion.ac.il/~dang/courseDS עצים ועצי חיפוש חומר קריאה לשיעור זה Chapter 5.5– Trees (91 – 97) Chapter 13– Binary Search.
Lecture3 of Geiger & Itai’s slide brochure
trees
www.cs.technion.ac.il/~dang/courseDS
עצים ועצי חיפוש
חומר קריאה לשיעור זה
Chapter 5.5– Trees (91 – 97)
Chapter 13– Binary Search Trees (244 – 262)
Geiger & Itai, 2001
2
trees
עצים
דוגמאות
ִ .1אילָן י ֻחֲ ִסין
אברהם
ישמאל
12בנים
יצחק
עשו
יעקב
יוסף
עוד 11בנים ובת
אפריים
מנשה
cs,Technion
3
trees
עצים
.2ביטויים אריתמטיים
))(5+3) * ((20/10) + (8-6
*
))((20/10) + (8-6
+
)(8-6
6
+
-
/
8
10
)(20/10
3
)(5+3
5
20
cs,Technion
4
trees
עצים
מכבי חיפה
.3עץ מנצחים (גביע)
מכבי חיפה
מכבי ת"א
.4מבנה היררכי
הפועל חיפה
מכבי חיפה
צה"ל
חיל הים
חיל האוויר
חיל היבשה
שריון
תותחנים
...
חי"ר
חטיבת צנחנים
חטיבת הנח"ל
גדוד 856
...
גדוד 934
מחלקה 1
מחלקה 2
כיתה 1
כיתה 2
אלון אבוטבול
cs,Technion
5
trees
(Directed Graphs) גרפים מכוונים
V ( המורכב מקבוצת צמתיםV,E) גרף מכוון הוא זוג
.E V X V וקבוצת קשתות
V = a,b,c,d,e
E = (a,b),(a,d),(b,c),(b,e),(c,c),(d,c),(d,e),(e,a),(e,c)
a
b
d
e
c
.m = 9, n = 5 : בדוגמא. m = |E| וכןn = |V| נסמן
6
trees
גרפים לא-מכוונים )(Undirected Graphs
גרף לא-מכוון הוא זוג ) (V,Eהמורכב מקבוצת צמתים Vוקבוצת קשתות E
קשת ב E-היא קבוצה בת שני איברים מתוך .Vקשת מסומנת ע"י )(i,j
(במקום הסימון המדויק יותר }.){i,j
c
b
a
e
d
חוג עצמי
V = a,b,c,d,e
E = (a,b), (a,d), (a,e) ,(b,c),(b,e),(c,c),(d,c),(d,e),(e,c)
נסמן | n = |Vוכן | . m = |Eבדוגמא.m = 9, n = 5 :
מספר הקשתות mקטן בכל גרף מ. n2 -
cs,Technion
7
trees
הגדרות לגרפים מכוונים )(Directed Graphs
c
b
a
e
d
V = a,b,c,d,e
E = (a,b),(a,d),(b,c),(b,e),(c,c),(d,c),(d,e),(e,a),(e,c)
מסלול (מכוון) בגרף (מכוון) ) (V,Eהוא סדרת צמתים ) (v1,v2,..,vkכך שלכל זוג
צמתים עוקבים בסדרה (vi,vi+1) ,היא קשת ב.E-
המסלול נקרא מעגל (מכוון) אם ( v1=vkלדוגמא.)(a,d,e,a) ,
גרף התשתית של גרף מכוון Gהוא גרף לא-מכוון עם אותם צמתים כמו בG -
ואותם קשתות כמו ב G-אך ללא כוון .לדוגמא:
a
b
c
e
d
8
trees
עצים מכוונים
מקור הוא צומת שאף קשת אינה מצביעה אליו.
עץ מכוון הוא גרף מכוון ללא מעגלים (בגרף התשתית שלו) ואשר לו מקור אחד
בלבד הנקרא שורש.
הגדרות
דוגמאות
vבן של uאם קיימת קשת מצומת uלצומת .v
fבן של b
uאב של vאם vבן של .u
bאב של e
a
b
c
g
k
f
j
i
e
d
h
cs,Technion
9
trees
עצים מכוונים
הגדרות
דוגמאות
vצֶאֱ צָא של uאם קיים מסלול מכוון מצומת uל.v -
gצאצא של a
ָ uאב ַק ְדמֹון של vאם vצאצא של .u
bאב-קדמון של h
תת-עץ של Gששורשו vהוא עץ מכוון שצמתיו הם vעצמו
וכל ַהצֶּאֱ צ ִָאים של ,vוהקשתות שלו הן הקשתות המחברות
צמתים אלו ב.G -
תת העץ ששורשו g
מכיל 3צמתים ושתי
קשתות.
דרגת צומת vהיא מספר הבנים של .v
דרגת aהיא .2
a
hהוא עלה.
b
עלה הוא צמת ללא בנים.
c
צומת פנימי הוא צומת
שאינו עלה.
g
k
f
j
i
e
d
h
cs,Technion
10
trees
עצים מכוונים
a
עומק של צומת vהוא מספר
הקשתות משורש העץ אל ( vהמרחק
מהשורש).
גובה של צומת vהוא מספר
הקשתות מ v-לצאצא הרחוק ביותר
k
של ( vעלה).
b
c
גובה 2
g
f
j
e
i
עומק 2
d
h
a
גובה העץ הוא הגובה של שורשו.
c
הערה :לעיתים נשמיט את
החצים מתוך הבנה שכוון
הקשתות כלפי מטה .כמו כן
לרוב נאמר עץ במקום עץ מכוון.
b
g
k
f
j
i
e
d
h
cs,Technion
11
trees
עצים מסודרים
עץ מסודר הוא עץ מכוון
a
שבו הבנים של כל צומת
מסודרים (משמאל לימין).
b
c
g
k
למשל עץ זה שונה מהעץ
העליון בגלל שסדר הבנים
השתנה.
f
j
e
i
d
h
a
b
c
g
k
j
f
d
i
h
e
cs,Technion
12
עצים בינריים
trees
עץ בינרי :עץ שבו לכל צומת שאינו עלה יש בן
שמאלי ו/או בן ימני.
הגדרה רקורסיבית :עץ בינרי הוא מבנה
.1ריק (ללא צמתים) ,או
.2מורכב משלושה חלקים :צומת הנקרא שורש,
עץ בינרי הנקרא תת-עץ שמאלי ,ועץ בינרי
הנקרא תת-עץ ימני.
cs,Technion
13
עצים בינריים מלאים ושלמים
trees
עץ בינרי מלא ) :(fullעץ שבו לכל צומת פנימי 2
בנים.
עץ בינרי שלם ) :(completeעץ בינרי מלא שבו כל
העלים באותו עומק.
עץ בינרי כמעט שלם :עץ בינרי שלם
שהוצאו ממנו עלים ("מצד ימין").
cs,Technion
14
trees
תכונות עצים בינריים שלמים
בעץ בינרי שלם בעל nצמתים L ,עלים ,וגובה :h
.1מספר הצמתים בעומק ni = 2i :i
.2מספר העלים:
.3מספר הצמתים:
L= nh= 2h
i
h 1
2
2
1
i 0
h
i 0 ni
h
n
.4הגובהh = log2(n+1) - 1 :
.5מספר הצמתים הפנימייםn - L = 2h - 1 = L - 1 :
0
1
2
3
cs,Technion
15
trees
מימוש "מערכי" לעץ בינרי שלם
a 1
c 3
b 2
e 5
f 6
g 7
d 4
o
n
m
l
k
j
i
h
15
14
13
12
11
10
9
8
בן שמאלי של צומת i
נמצא ב2i -
בן ימני של צומת iנמצא
ב2 i +1 -
אבא של של צומת iנמצא
ב i /2 -
9 10 11 12 13 14 15
8
7
6
5
4
3
2
1
i
h
g
f
e
d
c
b
a
o
l m n
k
j
0
יעיל רק עבור עצים שלמים או כמעת שלמים !
cs,Technion
trees
16
מימוש באמצעות מצביעים
typedef struct node {
value
left
right
DATA_Type value;
:מבנה צומת
struct node *left, *right;
} NODE;
b
b
d
e
d
e
h
h
i
k
k
0
cs,Technion
i
1
2
3
4
5
6
7
b
d
e
h
i
f
k
17
ִס ִ
ּיּורים בעצים בינריים
preorder
a
ַב ֵּקר בשורש
c
ַסיֵּר בתת העץ השמאלי
ַסיֵּר בתת העץ הימני
abdecfhgi
trees
b
f
g
i
e
d
h
postorder
inorder
ַסיֵּר בתת העץ השמאלי
ַסיֵּר בתת העץ השמאלי
ַסיֵּר בתת העץ הימני
ַב ֵּקר בשורש
ַב ֵּקר בשורש (חשוב ביטויים אריתמטיים)
ַסיֵּר בתת העץ הימני
debhf igca
dbeafhcig
cs,Technion
18
trees
חישוב ו ְַהמָ ָרה של ביטויים אריתמטיים
*
inorder
+
סייר בתת העץ השמאלי
בקר בשורש (הדפס)
-
סייר בתת העץ הימני
))(5+3)*((20/10)+(8-6
postorder
+
6
/
8
5
3
20
10
infix
סייר בתת העץ השמאלי
ביטויי postfixנקראים כתיב פולני
סייר בתת העץ הימני
ע"ש שם הלוגיקאי הפולני Łukasievicz
בקר בשורש (חשב את ערך הביטוי או הדפס).
בביטוי postfixאין צורך בסוגריים :לכל ביטוי
* 5 3 + 20 10 / 8 6 - +
postfixיש לכל היותר פרוק יחיד!
postfix
cs,Technion
19
trees
חישוב ביטוי postfixבאמצעות מחסנית
אלגוריתם לחישוב ביטוי postfix
.1התחל עם מחסנית ריקה.
.2עבור על כל ביטוי משמאל לימין:
.3אם האיבר הבא הוא אופרנד (מספר) -הכנס אותו למחסנית.
.4אם הוא פעולה – הפעל את הפעולה על שני האיברים
שבראש המחסנית והכנס את התוצאה למחסנית.
6
:postfix
32
*
2
8
8
10
4
2
2
2
2
20 20
8
+
8
-
8
6
8
8
8
/
8
20
8
10
3
8
+
5
3
5
5
cs,Technion
20
trees
מימוש פרוצדורת postorder
)void postorder (NODE *T
נשתמש במימוש "מצביעי"
מבנה צומת:
{
value
left
right
;if (T = = NULL) return
{ else
הערה :ע"י החלפת שורה #2עם
שורה #3נקבל מימוש של סיור
.inorder
/* 1*/
;)postorder( T left
/* 2*/
;)postorder( T right
/* 3*/
;”“visit
};return
}
תרגיל :Iיש לשנות תוכנית זו כך שתחשב ערך של ביטוי אריתמטי.
תרגיל :IIיש לכתוב תוכנית זו ללא רקורסיה (תוך שימוש במחסנית).
cs,Technion
21
trees
דוגמא לשימוש חביב
פונקציה רקורסיבית לחישוב גובה
:)postorder העץ (דוגמא לסיור
int height (NODE *T)
{
int L,R;
if (T = = NULL) return –1
else {
L = height(T left);
R = height(T right);
return 1 + max(L,R) ;
}
}
22
trees
מימושים של עצים מסודרים
a
b
e
d
c
f
g
h
i
j
k
:d אם לכל צמת דרגה
child[0]
cs,Technion
value(s)
child[1]
…
child[d-1]
23
trees
מימושים של עצים מסודרים
:נתן לייצג עץ מדרגה כלשהי ע"י עץ בינרי
value(s)
first-child
next-brother
a
b
cs,Technion
c
e
f
h
i
d
g
j
k
24
trees
עצים מסודרים
מה הקשר בין גובה העץ המקורי וגובה העץ הבינרי ?
a
d
c
g
k
j
b
f
e
i
h
, hnew d horiginalכאשר dהוא מספר הבנים המקסימלי בעץ המקורי.
cs,Technion
25
מילון )(Dictionary
trees
מילון מאחסן אוסף של ְרׁשּומֹות מהטיפוס (מפתח ,אינפורמציה).
המפתח שונה (בד"כ) מרשומה לרשומה.
אוסף המפתחות האפשריים מסומן ב .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
26
מילון ,מבנה חיפוש ועצי חיפוש
trees
פעולות נוספות כאשר מוגדר סדר על ( Uלמשל כאשר מפתח הוא מספר):
מינימום :החזר את המפתח המינימלי ב.D -
עוקב :החזר מצביע לאיבר במילון Dבעל המפתח הקטן
)min(D
)next(D,x
ביותר שגדול מ.x -
מילון +מינימום +עוקב נקרא = מבנה חיפוש
מטרה :לבצע את כל הפעולות בזמן )𝑛 ( 𝑂(logבמקרה הגרוע ביותר) כאשר n
הוא מספר המפתחות הנמצאים במילון בזמן ביצוע הפעולה.
עצי חיפוש :היא משפחה של מימושים למבנה חיפוש.
cs,Technion
27
trees
עץ בינרי כעץ חיפוש
נשתמש בעץ בינרי מכוון.
בכל צומת נאחסן רשומה אחת מתוך המילון (או מפתח ומצביע לאינפורמציה של
הרשומה).
נשמור על הכלל הבא :עבור צומת כלשהו בעל מפתח 𝑥 ,כל המפתחות בתת העץ
השמאלי קטנים מ x -וכל המפתחות בתת העץ הימני גדולים מ.𝑥 -
𝑥
𝑦
𝑧
yxz
cs,Technion
28
trees
T
120
122
60
30
20
156
63
37
35
145
88
70
100
80
cs,Technion
find(70,T)
find(80,T)
insert(80,T)
420
220
456
find סיבוכיות
𝑂(ℎ)
insert סיבוכיות
𝑂(ℎ)
29
trees
T
120
122
סיבוכיות max
)𝑂(ℎ
156
420
456
60
121
145
220
אם שומרים מצביע לאבר
המכסימלי סיבוכיות max
)𝑂(1
63
88
100
30
37
70
20
35
80
)max(T
)insert(121,T
cs,Technion
30
trees
next(T)
T
יש בן ימניT - ל:1 מקרא
120
122
60
30
20
63
37
35
121
145
88
70
156
100
420
220
456
𝑥
80
min(T->right)
cs,Technion
𝑧
𝑦
yxz
31
trees
אין בן ימניT - ל:2 מקרא
next(T)
s
𝑤
𝑧
𝑥
T
𝑦
yw xs z
cs,Technion
32
trees
120
122
סיבוכיות next
)𝑂(ℎ
156
420
456
60
121
145
220
אם שומרים מצביע לאבר
הבא ,סיבוכיות next
)𝑂(1
63
88
100
T
30
37
70
20
35
80
)next(T
cs,Technion
33
trees
T
delete
122
60
30
20
63
37
35
121
70
delete(100,T)
156
145
88
100
80
cs,Technion
1 מקרא
120
420
220
456
34
trees
T
2 מקרא
120
122
60
30
20
63
37
35
121
88
70
cs,Technion
145
420
220
80
delete(88,T)
156
456
35
trees
T
3 מקרא
120
122
60
30
20
63
37
35
delete(122,T)
cs,Technion
121
156
145
70
80
420
220
delete סיבוכיות
𝑂(ℎ)
456
36
trees
עץ בינרי כעץ חיפוש
8
20
הערה :בציור מופיעים רק המפתחות
ולא הרשומות במלואן.
3
11
7
אלגוריתם החיפוש:
1
)find(T,x
.1אם Tריק ,דווח ש x-לא בעץ.
.2יהי yהערך שבשורש.
.3אם ,x = yהחזר מצביע לצומת המחזיק את .x
.4אם ,x >yהמשך את החיפוש בתת העץ השמאלי של .T
.5אחרת (כאשר ,) x < yהמשך את החיפוש בתת העץ הימני של .T
cs,Technion
37
סיכום הכנסה והוצאה בעץ חיפוש
אלגוריתם הכנסה:
trees
)insert(T,x
.1חפש את xבעץ החיפוש .T
.2אם xנמצא ב ,T-עצור ודווח.
.3יהי vהצומת האחרון במסלול החיפוש של xויהי yהמפתח שנמצא ב.v-
.4אם ,x>yהוסף צומת wעם מפתח xכבן שמאלי של .v
.5אחרת ( כאשר ,) x < yהוסף צומת wעם מפתח xכבן ימני של .v
8
20
)insert(T,4
3
11
7 v
1
4 w
cs,Technion
38
trees
הוצאה מעץ חיפוש – המקרים הקלים
אלגוריתם הוצאה :יהי vצומת בעץ המיועד להוצאה.
.1אם vעלה ,סלק אותו.
.2אם ל v-בן יחיד ,תן לאבא של vלהצביע על הבן.
5
delete 1
8
9
2
7
8
4
6
2
9
4
7
6
3
5
7
6
3
8
2
3
1
5
delete 4
8
9
5
9
2
4
7
6
3
39
trees
הוצאה מעץ חיפוש
אלגוריתם הוצאה .יהי vצומת בעץ המיועד להוצאה.
.1אם vעלה ,סלק אותו.
.2אם ל v-בן יחיד ,תן לאבא של vלהצביע על הבן.
.3אחרת :יהי wהצומת העוקב ל v-בסדר ( .inorderזהו הצומת המכיל את הערך הבא אחרי
הערך שב v -כלומר הצומת המתקבל ע"י פניה אחת ימינה ואח"כ כל הדרך שמאלה .שימו לב שלצומת
wבן אחד לכל היותר).
.4החלף בין צומת vוצומת .w
.5כעת יש ל v-לכל היותר בן אחד .המשך בצעד 1או 2כנדרש.
w 6
5
delete 5
8
9
2
3
7
v
נותר להוציא את ( vצעד .)5
v
8
9
2
3
7
w
6
cs,Technion
40
trees
דוגמא נוספת
v
w
5
delete 5
2
8
2
3
w
7
8
v
3
9
w
7
2
8
3
v
9
7.5
cs,Technion
9
7.5
7.5
delete “v”
7
41
trees
:סיבוכיות הפעולות
סיבוכיות
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)
מינימום
עוקב
42
trees
נתוח זמנים
זמן חיפוש/הכנסה/הוצאה הוא לינארי בגובה העץ.
מהו גובה העץ?
מקרה טוב .עץ שלם.
h= log n
מקרה גרוע .עץ הנראה כרשימה ליניאריתh = n - 1 .
ומהו הגובה הממוצע ?
cs,Technion
43
trees
גובה ממוצע
ברור שצורת העץ נקבעת על פי סדר ההכנסה
(למשל הסדר 1,2,3יוצר שרשרת לעומת 2,1,3שיוצר עץ מאוזן).
מספר אפשרויות (הסדרים) להכניס 𝑛 צמתים לעץ הוא !.n
נסמן ב h(i) -את גובה העץ הנוצר בסדר ה.i-
!1 n
)h h(i
n! i 1
הגובה הממוצע מוגדר כדלקמן:
3,2,1
3,1,2
3
3
h(5)
h(6) 2
2,1,3
2
1
2
1
2
3
1
3
h(3) h(4) 1
2,3,1
1,3,2
1,2,3
2
1
1
1
2
3
h(2) 2
2
3
h(1) 2
cs,Technion
44
trees
גובה ממוצע
הגובה הממוצע מוגדר כדלקמן:
!1 n
)h h(i
n! i 1
h(1) h(2) h(3) h(4) h(5) h(6) 10
2
h
1
6
6
3
ניתן להראות שהגובה הממוצע הוא )O(log n
כלומר בממוצע כל הפעולות מתבצעות בזמן ).O(log n
ההוכחה (עמודים 254-258בספר הלימוד) מושמטת.
נבחן טענה דומה אך קלה יותר להוכחה:
זמן בניה ממוצע של עץ חיפוש בינרי הוא ).O(n log n
cs,Technion
45
זמן בניה צפוי של עץ חיפוש בינרי
trees
נחשב את זמן בנית עץ אקראי המתקבל מהכנסת פרמוטציה אקראית a1…anלעץ ריק.
נניח שסדר האיברים הוא b1…bn
a1
bj
bj+1…bn
b1…bj-1
נסמן ב T(n) -את מספר ההשוואות הממוצע הדרוש לבניית עץ בן nצמתים.
לפיכך ) T(j-1הוא מספר ההשוואות הממוצע הדרוש לבניית עץ בן j-1צמתים
ו T(n-j) -הוא מספר ההשוואות הממוצע הדרוש לבניית עץ בן n-jצמתים.
משוואת ההפרשים המתאימה:
)(T (0) 0
1 n
T (n) (n 1) T ( j 1) T (n j )
n j 1
46
trees
פתרון משואת ההפרשים
1 n
T (n) (n 1) T ( j 1) T (n j )
n j 1
(T (0) 0)
1 n
2 n1
T (n) (n 1) T ( j 1) T (n j ) (n 1) T ( j )
n j 1
n j 1
n 1
nT (n) n(n 1) 2T ( j )
j 1
n2
(n 1)T (n 1) (n 1)(n 2) 2T ( j )
j 1
nT (n) (n 1)T (n 1) 2(n 1) 2T (n 1)
nT (n) 2n 2 (n 1)T (n 1)
cs,Technion
47
trees
פתרון משואת ההפרשים
nT (n) 2n 2 (n 1)T (n 1)
T ( n)
2
2
T (n 1)
2
n 1
n 1
n( n 1)
n
n 1
g ( n)
g ( n)
T ( n 1)
n
T ( n)
n 1
נגדיר
2
g ( n)
g (n 1)
n 1
2
2
2
g (n 1)
g (n 2) 2 H n 1 O(log n)
n 1
n 1 n
לכן
cs,Technion
T ( n)
O(log n) T (n) O(n log n)
n 1
48
trees
עוד על המספר ההרמוני
n 1
1
)H n i 1 ln n 0.57721... o O (ln n
i
n
קבוע אוילר
על קבוע אוילר:
limH n ln n
n
אוילר ,שהגדיר את הקבוע ,ציין כי הוא "ראוי להתייחסות רצינית"
0.5772156649
0153286060
6512090082
402431042
...
לא ידוע אם הוא רציונלי (אם כן ,יש לו יותר מ 10242,080-ספרות במכנה)
cs,Technion