005.class6_Trees

Download Report

Transcript 005.class6_Trees

‫מבני נתונים‬
‫שיעור ‪ – 6‬עצים‪ ,‬עצים בינאריים‬
‫עצי חיפוש‪ ,‬עצי ‪.AVL‬‬
‫עצים‬
‫• עץ הינו מבנה נתונים היררכי הבנוי בדומה לעץ עם‬
‫ענפים ועלים‪.‬‬
‫עצים ‪ -‬הגדרה‬
‫• מבנה נתונים היררכי מופשט‪.‬‬
‫• עץ מורכב מאיברים בעלי יחסי הורה‪-‬ילד‬
‫• שימושים‪:‬‬
‫– תרשימים לארגון נתונים‬
‫– ארגון קבצים (תיקיות וקבצים)‬
‫– מבנים וארגונים היררכיים (צבא‪ ,‬מפעל)‬
‫‪R&D‬‬
‫‪Computers”R”Us‬‬
‫‪Manufacturing‬‬
‫‪Desktops‬‬
‫‪Laptops‬‬
‫‪Canada‬‬
‫‪Sales‬‬
‫‪International‬‬
‫‪Asia‬‬
‫‪US‬‬
‫‪Europe‬‬
‫מושגי יסוד‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫שורש ‪ -‬איבר ללא הורה (‪)A‬‬
‫ענף (איבר פנימי) ‪ -‬בעל לפחות ילד אחד (‪)A,B,C,F‬‬
‫עלה (איבר חיצוני) – איבר ללא ילדים )‪(D,E,G,H,I,J,K‬‬
‫אב קדמון של איבר‪ -‬כל דורות ההורים‬
‫עומק של איבר – מספר האבות הקדמונים )‪(F=2‬‬
‫‪A‬‬
‫גובה העץ – עומק מקסימלי בכל העץ (‪)3‬‬
‫צאצאים – ילדים‪ ,‬נכדים וכו'‬
‫‪C‬‬
‫‪D‬‬
‫תת עץ – מורכב מאיבר וכל צאצאיו‬
‫‪H‬‬
‫‪G‬‬
‫‪subtree‬‬
‫‪B‬‬
‫‪E‬‬
‫‪F‬‬
‫‪K‬‬
‫‪J‬‬
‫‪I‬‬
‫תכונות של עצים‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫מבנה היררכי ללא מעגלים‬
‫קיים מסלול יחיד מהשורש לכל אחד מאיברי העץ‬
‫לכל איבר הורה יחיד אך יכולים להיות לו מספר‬
‫ילדים‬
‫סדר – קיים סדר מסויים לעבור על איברי העץ‪.‬‬
‫רקורסיה – כל תת‪-‬עץ מקיים את כל התכונות של‬
‫העץ כולו‬
‫מבנה העץ‬
‫כל איבר )‪ (Node‬מכיל‪:‬‬
‫‪ .1‬נתונים‬
‫‪ .2‬מצביע על ההורה‬
‫‪ .3‬מערך מצביעים על הילדים ‪‬‬
‫‪D‬‬
‫‪E‬‬
‫‪B‬‬
‫‪‬‬
‫‪F‬‬
‫‪B‬‬
‫‪F‬‬
‫‪‬‬
‫‪A‬‬
‫‪D‬‬
‫‪A‬‬
‫‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪E‬‬
‫‪C‬‬
‫עץ בינארי‬
‫• עץ בינארי הוא עץ בעל התכונות הבאות‪:‬‬
‫– לכל איבר פנימי יש לכל היותר ‪ 2‬ילדים‬
‫– ערכי הילדים של איבר פנימי מסודרים ע"פ סדר מסויים‬
‫– הילדים של איבר פנימי נקראים "ילד שמאלי" ו"ילד ימני"‬
‫בהתאמה‬
‫‪A‬‬
‫• שימושים‪:‬‬
‫– מיון‬
‫– תהליכי החלטה‬
‫– ביטויים אריתמטיים‬
‫‪C‬‬
‫‪G‬‬
‫‪B‬‬
‫‪F‬‬
‫‪D‬‬
‫‪E‬‬
‫‪I‬‬
‫‪H‬‬
‫דוגמאות לעצים בינאריים‬
A
A
B
B
C
C
D
E
F
G
D
H
I
Tree A
Size 9 Depth 3
E
Tree B
Size 5 Depth 4
‫עץ בינארי של ביטוי אריתמטי‬
‫•‬
‫•‬
‫•‬
‫•‬
‫ניתן להגדיר ביטויים אריתמטיים בעזרת עץ בינארי‬
‫איברים פנימיים – פעולות אריתמטיות‬
‫איברים חיצוניים (עלים) – מספרים‪/‬משתנים‬
‫דוגמא‪ :‬הביטוי ))‪ (2  (a - 1) + (3  b‬מתואר בעץ‪:‬‬
‫‪+‬‬
‫‪‬‬
‫‪b‬‬
‫‪‬‬
‫‪-‬‬
‫‪3‬‬
‫‪1‬‬
‫‪2‬‬
‫‪a‬‬
‫עצי החלטה בינאריים‬
‫•‬
‫•‬
‫•‬
‫•‬
‫עץ החלטה בינארי מתאר תהליך קבלת החלטה‬
‫איברים פנימיים – שאלות עם תשובות כן‪/‬לא‬
‫איברים חיצוניים (עלים) – החלטות‬
‫דוגמא‪ :‬עץ החלטה על ארוחת ערב‬
‫?‪Want a fast meal‬‬
‫‪No‬‬
‫‪Yes‬‬
‫?‪On expense account‬‬
‫?‪How about coffee‬‬
‫‪No‬‬
‫‪Yes‬‬
‫‪No‬‬
‫‪Yes‬‬
‫‪Café Paragon‬‬
‫‪Al Forno‬‬
‫‪Spike’s‬‬
‫‪Starbucks‬‬
‫עצי חיפוש בינאריים‬
‫• חוקיות סדר בעץ חיפוש בינארי‪ :‬לכל איבר ערך‬
‫הילד השמאלי תמיד קטן מהאיבר וערך הילד‬
‫הימני תמיד גדול מהאיבר‪.‬‬
‫• חוקיות זו משמעותה שעץ בינארי לא יכיל שני‬
‫ערכים זהים‪.‬‬
‫• שיטות הכנסת והוצאת איברים מהעץ דואגות‬
‫לשמר את חוקיות הסדר‪.‬‬
‫ עצי חיפוש בינאריים‬- ‫דוגמאות‬
25
53
10
37
Binary Search Tree 2
15
30
Binary Search Tree 1
30
50
59
62
Binary Search Tree 3
65
‫יתרונות בעץ חיפוש בינארי‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫משלב יתרונות של מערך ממויין ורשימה מקושרת‬
‫ניתן לבצע חיפוש במהירות בדומה למערך ממויין‬
‫חיפוש ברשימה מקושרת יקר‪ ,‬מדוע?‬
‫ניתן למחוק ולהכניס איברים בקלות בדומה‬
‫לרשימה מקושרת‬
‫הכנסת איבר למערך ממויין מורכב‪ ,‬מדוע?‬
‫מבנה עץ בינארי‬
A
B
C
D
E
F
H
G
Abstract Tree Model
left
left
B
G
right
right
left
left
A
left
D
right
left
E
right
right
right
left
Tree Node Model
C
left
H
right
F
right
‫מימוש עץ בינארי בג'אווה‬
Node ‫מחלקה‬
public class Node
{
public int data;
private Node leftChild;
private Node rightChild;
}
‫מימוש עץ בינארי בג'אווה‬
Tree ‫מחלקת‬
public class Tree
{
private Node root;
//Methods
public Node find(int key)
public void insert(int key)
public void delete(int key)
//and more methods…
}
‫מימוש עץ בינארי בג'אווה‬
Main ‫דוגמא למחלקת‬
public class Maim
{
public static void main(String[] args)
{
Tree theTree = new Tree();
theTree.insert(50);
theTree.insert(70);
theTree.insert(12);
Node x = theTree.find(70);
theTree.delete(12);
Node y = theTree.find(12);
}
}
‫שיטת ‪find‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫פעולת חיפוש הינה פעולה פשוטה בעץ בינארי‬
‫עקב המבנה והסדר המיוחד של העץ‪.‬‬
‫מחפשת אוביקט ‪ Node‬עם מפתח מסוים‪ ,‬אם‬
‫נמצא מחזירה את האוביקט אם לא מחזירה ‪null‬‬
‫המפתח יכול להיות תעודת זהות או מס' סידורי‬
‫מתחילים מהשורש‪ ,‬אם מפתח השורש שווה‬
‫למבוקש סיימנו‪ ,‬אם המפתח המבוקש גדול ממנו‬
‫עוברים לילד הימני אחרת לשמאלי‪ .‬וממשיכים עד‬
‫שמוצאים‪ ,‬או שהעץ נגמר‪.‬‬
‫דוגמא לחיפוש – איבר ‪57‬‬
‫חיפוש ערך בעץ בינארי‬
Current Node
Root = 50
Node = 30
Node = 35
Node = 37
(Node = 37)
Action
Compare item = 37 and 50
37 < 50, move to the left subtree
Compare item = 37 and 30
37 > 30, move to the right subtree
Compare item = 37 and 35
37 > 35, move to the right subtree
Compare item = 37 and 37. Item
found.
50
30
55
25
10
35
32
15
53
37
60
62
find ‫מימוש שיטת‬
public Node find (int key){
Node current = root;
while (current.data != key){
if(key < current.data)
current = current.leftChild; //‫בן שמאלי‬
else
current = current.rightChild; //‫בן ימני‬
if(current == null)
return null //‫לא נמצא‬
}
return current;//‫איבר מוחזר‬
}
find ‫מימוש רקורסיבי שיטת‬
public Node findR (int key, Node current){
if(current == null);
return null //‫לא נמצא‬
if(key < current.data)
return findR(key, current.leftChild); //‫בן שמאלי‬
if(key == current.data)
return current;//‫איבר מוחזר‬
if(key > current.data)
return findR(key, current.rightChild); //‫בן ימני‬
}
‫שיטת ‪insert‬‬
‫• פעולת הכנסת איבר היא למעשה זהה לפעולת‬
‫חיפוש איבר שאינו קיים‪.‬‬
‫• בדומה לחיפוש איבר‪ ,‬בהכנסת איבר חדש‬
‫"מטיילים" על העץ עד שמגיעים לעלה‪ ,‬אשר הופך‬
‫להורה של האיבר החדש המוכנס‪.‬‬
‫• האיבר החדש יהיה בן שמאלי של העלה אם הוא‬
‫קטן ממנו‪ ,‬או בן ימני אם הוא גדול ממנו (בהתאם‬
‫לחוקיות הסדר)‬
‫שיטת ‪ - insert‬דוגמא‬
‫‪6‬‬
‫<‬
‫‪9‬‬
‫>‬
‫‪8‬‬
‫>‬
‫‪2‬‬
‫‪1‬‬
‫‪4‬‬
‫‪w‬‬
‫‪6‬‬
‫‪2‬‬
‫‪9‬‬
‫‪4‬‬
‫‪8‬‬
‫‪w‬‬
‫‪5‬‬
‫‪1‬‬
‫•הכנסת הערך ‪.5‬‬
‫•תחילה מתבצע חיפוש ‪ find‬עם‬
‫המפתח ‪5‬‬
‫•אנו מניחים שלא קיים איבר עם ערך ‪5‬‬
‫•כאשר מגיעים לעלה ‪ W‬מוסיפים את‬
‫האיבר החדש במקומו (מימין ל ‪)4‬‬
‫סריקת איברי העץ ‪Traversing -‬‬
‫• פעולה זו עוברת על כל איברי העץ ע"פ סדר מסוים‬
‫• פעולת הסריקה פחות שימושית מחיפוש איבר‬
‫מסוים‬
‫• קיימות ‪ 3‬דרכים פשוטות לסריקת עץ בינרי‬
‫– ‪ :Inorder‬סריקה על כל איברי העץ בסדר עולה‬
‫– ‪ :Preorder‬כל איבר נסרק לפני הילדים שלו‬
‫– ‪ :Postorder‬כל איבר נסרק אחרי הילדים שלו‬
‫סריקת ‪Inorder‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫צורת הסריקה השכיחה והשימושית ביותר‪.‬‬
‫מאפשר ליצור רשימה ממוינת של איברי העץ‬
‫מימוש רקורסיבי יעיל לסריקת ‪Inorder‬‬
‫השיטה נקראת עם איבר נוכחי‪ ,‬כאשר מתחילים‬
‫מהשורש‪ ,‬ומבצעת שלושה פעולות‪:‬‬
‫‪ .1‬השיטה קוראת לעצמה (רקורסיה) עם הבן השמאלי‬
‫‪ .2‬מבצעת פעולה על האיבר הנוכחי (פעולת הביקור)‬
‫‪ .3‬השיטה קוראת לעצמה (רקורסיה) עם הבן הימני‬
‫דוגמא ‪ -‬סריקת ‪Inorder‬‬
‫דוגמא ‪ -‬סריקת ‪Inorder‬‬
‫סריקת ‪Preorder‬‬
‫• שיטה רקורסיבית לסריקת ‪ Preorder‬נקראת עם‬
‫איבר נוכחי החל מהשורש‪:‬‬
‫‪ .1‬מבצעת פעולה על האיבר הנוכחי (פעולת הביקור)‬
‫‪ .2‬השיטה קוראת לעצמה (רקורסיה) עם הבן השמאלי‬
‫‪ .3‬השיטה קוראת לעצמה (רקורסיה) עם הבן הימני‬
‫• שיטת סריקה זו שימושית כאשר יש להדפיס‬
‫מסמך עם פרקים ותתי פרקים ע"פ הסדר‬
Preorder ‫דוגמא – סריקת‬
1
Make Money Fast!
2
5
1. Motivations
9
2. Methods
3
4
1.1 Greed
1.2 Avidity
6
2.1 Stock
Fraud
7
2.2 Ponzi
Scheme
References
8
2.3 Bank
Robbery
‫סריקת ‪Postorder‬‬
‫• שיטה רקורסיבית לסריקת ‪ Postorder‬נקראת עם‬
‫איבר נוכחי החל מהשורש‪:‬‬
‫‪ .1‬השיטה קוראת לעצמה (רקורסיה) עם הבן השמאלי‬
‫‪ .2‬השיטה קוראת לעצמה (רקורסיה) עם הבן הימני‬
‫‪ .3‬מבצעת פעולה על האיבר הנוכחי (פעולת הביקור)‬
‫• שיטת סריקה זו שימושית כאשר יש לחשב נפח‬
‫קבצים של תיקיות ותתי תיקיות‪.‬‬
Postorder ‫דוגמא – סריקת‬
9
cs16/
3
8
7
homeworks/
todo.txt
1K
programs/
1
2
h1c.doc
3K
h1nc.doc
2K
4
DDR.java
10K
5
Stocks.java
25K
6
Robot.java
20K
‫מחיקת איבר מעץ בינארי‬
25
//
\\
10
37
15
65
30
Delete node 25
30
37
10
65
15
30
Bad Solution: 30 is out of place
(a)
10
37
65
15
Good Solution
(b)
‫מקרה א – מחיקת עלה‬
Before
After
40
40
30
P
D
25
10
35
26
30
65
50
P
25
35
26
33
29
Delete leaf node 10.
pNodePtr->left is dNode
50
33
29
34
28
65
34
28
No replacement is necessary.
pNodePtr->left is NULL
‫מקרה ב – מחיקת איבר עם בן שמאלי בלבד‬
After
Before
40
40
P
30
25
10
D
26
33
29
P
65
35
R
30
25
50
10
28
Delete node 35 with only a left child:
Node R is the left child.
R
33
50
34
26
34
65
29
28
Attach node R to the parent.
‫מקרה ב – מחיקת איבר עם בן ימני בלבד‬
Before
After
40
40
30
P
10
65
25
D
35
26
R
P
50
33
29
30
10
34
65
25
R
28
35
29
50
33
34
28
Delete node 26 with only a right child:
Node R is the right child.
Attach node R to the parent.
...‫מקרה ב – מחיקת איבר עם שני בנים‬
40
40
30
65
25
10
35
26
50
33
29
65
25
35
26
10
34
28
50
33
29
34
28
Delete node 30 with two children.
?‫שיעור הבא? אולי שנה הבא‬
Orphaned subtrees.
‫תרגיל‬
‫נתון עץ בינארי כלשהו בעל ‪ n‬צמתים‪ .‬בכל צומת יש‪:‬‬
‫•‬
‫•‬
‫•‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫מפתח – מספר טבעי כלשהו‬
‫שני מצביעים לבנים‬
‫שדה נוסף המכיל מספר טבעי (מותר להשתמש בו לביצוע המשימה הנדרשת)‬
‫הצע אלג' לחישוב ערכו של המסלול הכבד ביותר בעץ מהשורש לעלה‪ .‬המסלול‬
‫הכבד הינו המסלול שסכום המפתחות בצמתים שלו הוא מקסימלי‪.‬‬
‫יש להדפיס את הערכים לאורך מסלול זה‪.‬‬
‫סיבוכיות זמן נדרשת – )‪O(n‬‬
‫פתרון‬
‫•‬
‫חישוב הערך‪:‬‬
‫•‬
‫•‬
‫מחשבים באופן רקורסיבי עבור שני תת‪-‬העצים ומוסיפים את ערך השורש למקסימום‬
‫מבינהם‪.‬‬
‫הדפסת המסלול‪:‬‬
‫•‬
‫•‬
‫בשדה הנוסף בכל צומת נרשום ‪ 0‬אם המקסימום התקבל מתת‪-‬העץ השמאלי‪ ,‬ו‪ 1 -‬אם‬
‫מהימני‪.‬‬
‫לאחר חישוב הערך נדפיס לאורך המסלול המסומן את ערכיו‪.‬‬
‫דוגמא‪:‬‬
‫‪100+20‬‬
‫‪20‬‬
‫‪50‬‬
‫‪0‬‬
‫‪100‬‬