270 likes | 404 Views
Korrekt dybde først-søk. Åsmund Eldhuset asmunde *at* stud.ntnu.no www.stud.ntnu.no/~asmunde/dfs.ppt. Bakgrunn. Mange ser ut til å ha skrevet DFS ved bare å kopiere BFS-koden og bytte ut pop(0) med pop() Dette er imidlertid IKKE riktig måte å gjennomføre stakkbasert DFS på
E N D
Korrekt dybde først-søk Åsmund Eldhuset asmunde *at* stud.ntnu.no www.stud.ntnu.no/~asmunde/dfs.ppt
Bakgrunn • Mange ser ut til å ha skrevet DFS ved bare å kopiere BFS-koden og bytte ut pop(0) med pop() • Dette er imidlertid IKKE riktig måte å gjennomføre stakkbasert DFS på • Det fungerer i praksisøving 2, for søket klarer å finne alle noder som kan nås fra en bestemt node, men det er altså ikke et korrekt DFS • Her vil vi vise hvordan det skal gjøres
Rekursiv DFS • DFS er egentlig definert rekursivt (Cormen, s. 541) • Hvis du vil slippe å lese resten av denne foilen, kan du bare holde deg til DFS som definert i Cormen • Stakkbasert DFS skal etterligne rekursiv DFS. Motivasjonen er at rekursjon har følgende ulemper: • Du risikerer å krasje pga. for mange rekursive kall • Rekursive kall tar ekstra tid
Fargelegging • I DFS fargelegger man noder med hvitt, grått og svart for å indikere statusen deres • I Cormen viser man mange fine egenskaper ved disse fargene, som man kan bruke til å utlede ting om grafen man søker i • Fargeleggingen blir gal hvis man ikke gjør DFS riktig
Kode – rekursiv DFS def dfs(node): node.colour = Grey for adj in node.adjacent: if node.colour == White: dfs(adj) node.colour = Black
Kode – gal stakk-DFS def dfs(startNode): startNode.colour = Grey stack = [startNode] while stack: node = stack.pop() node.colour = Black for adj in node.adjacent: if adj.colour == White: adj.colour == Grey stack.append(adj)
Gal DFS A A B C E D Besøkt: A
Gal DFS B C A B C E D Besøkt: A, B
Gal DFS D C A B C E D Besøkt: A, B, D
Gal DFS E C A B C E D Besøkt: A, B, D, E
Gal DFS C A B C E D Besøkt: A, B, D, E, C
Gal DFS A B C E D Besøkt: A, B, D, E, C
Regler for korrekt DFS • En node skal være hvit helt til den treffes på første gang; da skal den farges grå og legges i stakken • Nodene på stakken (og ingen andre) skal være grå • En node skal ligge i stakken helt til alle barna dens er ferdigbehandlet; da tas den ut og farges svart • Kun ett barn skal legges til av gangen
Kode – korrekt stakk-DFS def dfs(startNode): startNode.colour = Grey stack = [startNode] while stack: node = stack[len(stack) - 1] if node.next == len(node.adjacent): node.colour = Black stack.pop() else: adj = node.adjacent[node.next] if adj.colour == White: adj.colour = Grey stack.append(adj) node.next += 1
0/2 0/2 0/1 0/0 0/1 Korrekt DFS A A B C E D Besøkt: A
1/2 0/2 0/1 0/0 0/1 Korrekt DFS B A A B C E D Besøkt: A, B
1/2 1/2 0/1 0/0 0/1 Korrekt DFS C B A A B C E D Besøkt: A, B, C
1/2 1/2 1/1 0/0 0/1 Korrekt DFS E C B A A B C E D Besøkt: A, B, C, E
1/2 1/2 1/1 0/0 0/1 Korrekt DFS C B A A B C E D Besøkt: A, B, C, E
1/2 1/2 1/1 0/0 0/1 Korrekt DFS B A A B C E D Besøkt: A, B, C, E
1/2 2/2 1/1 0/0 0/1 Korrekt DFS D B A A B C E D Besøkt: A, B, C, E, D
1/2 2/2 1/1 0/0 1/1 Korrekt DFS D B A A B C E D Besøkt: A, B, C, E, D
1/2 2/2 1/1 0/0 1/1 Korrekt DFS B A A B C E D Besøkt: A, B, C, E, D
1/2 2/2 1/1 0/0 1/1 Korrekt DFS A A B C E D Besøkt: A, B, C, E, D
2/2 2/2 1/1 0/0 1/1 Korrekt DFS A A B C E D Besøkt: A, B, C, E, D
2/2 2/2 1/1 0/0 1/1 Korrekt DFS A B C E D Besøkt: A, B, C, E, D