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 -‬וכל המפתחות בתת העץ הימני גדולים מ‪.𝑥 -‬‬
‫𝑥‬
‫𝑦‬
‫𝑧‬
‫‪yxz‬‬
‫‪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
𝑧
𝑦
yxz
31
trees
‫ אין בן ימני‬T -‫ ל‬:2 ‫מקרא‬
next(T)
s
𝑤
𝑧
𝑥
T
𝑦
yw xs 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 n1
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)  2T ( j )
j 1
n2
(n  1)T (n  1)  (n  1)(n  2)  2T ( 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‬‬
‫קבוע אוילר‬
‫על קבוע אוילר‪:‬‬
‫‪  limH n  ln n ‬‬
‫‪n‬‬
‫אוילר‪ ,‬שהגדיר את הקבוע‪ ,‬ציין כי הוא "ראוי להתייחסות רצינית"‬
‫‪  0.5772156649‬‬
‫‪0153286060‬‬
‫‪6512090082‬‬
‫‪402431042‬‬
‫‪...‬‬
‫לא ידוע אם הוא רציונלי (אם כן‪ ,‬יש לו יותר מ‪ 10242,080-‬ספרות במכנה)‬
‫‪cs,Technion‬‬