Download presentation
Presentation is loading. Please wait.
1
תזכורת: גרפים גרף (G=(V,E V|=n, |E|=m| מכוון \ לא מכוון דרגה של קדקד
מסלול בגרף רכיבי קשירות
2
מטריצת שכנויות A B C D E A 0 0 0 0 0 B 1 0 0 0 0 C 0 1 0 0 1
3
רשימות שכנות A 12345 E 1 2 5 3 5 1 4 C B D
4
גרף מצביעים class Node { // private data members Node getNbr(int i){
// compute I’th nbr }
5
גרף לא מפורש class State { // …. void move( …. ) { // change state }
6
סריקת גרף אלגוריתם נאיבי search(s): print s for all u in s.nbrs
search(u) קלט: גרף G, קדקד s פלט: כל הקדקדים אליהם יש מסלול ב-G מ-s
7
רעיון לשיפור: Memoization
F = {s} Repeat v <- node from F for all v in u.nbrs if v not in F F = F + {v} Until no new nodes שיטות סריקה חיפוש לרוחב: Breadth First Search חיפוש לעומק: Depth First Search חיפוש לפי טיב Best First Search ...
8
חיפוש לרוחב: (BFS(G,s while Q not empty u = Q.deque() print u
for all v in u.nbrs if not v.visited v.visited=true Q.enque(v) אתחול: Que Q = {} for all v in V v.visited = false s.visited = true Q.enque(s)
9
מסלולים קצרים ביותר עובדה: לכל קדקד v (פרט ל- s) קיים קדקד u כך שב-G יש צלע (u,v), ו: d(s,v) = d(s,u) + 1 הגדרה: אורך המסלול הקצר ביותר ב-G מ-s ל-u יסומן ב- d(s,u) עובדה: אם ב-G יש צלע (u,v) אזי: d(s,v) <= d(s,u) + 1 u v
10
BFS עם חשוב מרחקים while Q not empty u = Q.deque() for all v in u.nbrs
if not v.visited v.visited=true v.d = u.d + 1 v.father = u Q.enque(v) אתחול: for all v in V v.visited = false v.d = infinity v.father = NULL s.visited = true s.d = 0 Que Q = {s}
11
נכונות BFS למה: אם d(s,u) < d(s,w) אזי u נכנס לתור לפני w.
הוכחה: באינדוקציה על d=d(s,u) משפט: בסוף הריצה, לכל הקדקדים v: v.d = d(s,v) הוכחה: באינדוקציה על d=d(s,v)
12
הדפסת מסלול קצר ביותר משפט: אלגוריתם זה מדפיס מסלול קצר ביותר מ-s ל-v.
path(v) מדפיס את המסלול הקצר ביותר מ-s ל-v. if v != s path(v.father) print v
13
חיפוש לעומק: DFS אתחול: for all v in V v.visited = false DFS(s)
DFS(u): // starting with u u.visited = true print u for all v in u.nbrs if not v.visited DFS(v) // finished with u
14
מיון טופולוגי משפט: לגרף G יש מיון טופולוגי אםם אין בו מעגל.
הוכחה: נבנה אלגוריתם! קלט: גרף G פלט: מיון טופולוגי של הקדקדים. הגדרה: מיון טופולוגי הינו סידור של הקדקדים כך שאם יש בגרף צלע (u,v) אזי u יופיע לפני v בסדר.
15
מיון טופולוגי עם DFS אתחול: DFS(u): u.visited = true for all v in V
v.visited = false v.finished = false if not v.visited DFS(v) DFS(u): u.visited = true for all v in u.nbrs if not v.visited DFS(v) else if not v.finished exit “cycle exists” print u u.finished = true
16
נכונות למה: אם בתוך ריצת DFS(u) נתקלנו ב v שהינו
למה: אם בתוך ריצת DFS(u) נתקלנו ב v שהינו visited and not finished אזי יש מסלול מ-v ל-u בגרף. משפט 1: אם אין בגרף מעגלים אזי האלגוריתם מדפיס מיון טופולוגי (בסדר הפוך). 2: אם יש בגרף מעגל אזי האלגוריתם אומר כך.
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.