Laste ned presentasjonen
Presentasjon lastes. Vennligst vent
1
Korrekt dybde først-søk
Åsmund Eldhuset asmunde *at* stud.ntnu.no
2
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
3
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
4
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
5
Kode – rekursiv DFS def dfs(node): node.colour = Grey
for adj in node.adjacent: if node.colour == White: dfs(adj) node.colour = Black
6
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)
7
Gal DFS A A B C E D Besøkt: A
8
Gal DFS B C A B C E D Besøkt: A, B
9
Gal DFS D C A B C E D Besøkt: A, B, D
10
Gal DFS E C A B C E D Besøkt: A, B, D, E
11
Gal DFS C A B C E D Besøkt: A, B, D, E, C
12
Gal DFS A B C E D Besøkt: A, B, D, E, C
13
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
14
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
15
Korrekt DFS A A 0/2 0/1 0/0 B C E D Besøkt: A
16
Korrekt DFS B A A 0/2 1/2 0/1 0/0 B C E D Besøkt: A, B
17
Korrekt DFS C B A A 1/2 0/1 0/0 B C E D Besøkt: A, B, C
18
Korrekt DFS E C B A A 1/2 1/1 0/0 0/1 B C E D Besøkt: A, B, C, E
19
Korrekt DFS C B A A 1/2 1/1 0/0 0/1 B C E D Besøkt: A, B, C, E
20
Korrekt DFS B A A 1/2 1/1 0/0 0/1 B C E D Besøkt: A, B, C, E
21
Korrekt DFS D B A A 2/2 1/2 1/1 0/0 0/1 B C E D Besøkt: A, B, C, E, D
22
Korrekt DFS D B A A 2/2 1/2 1/1 0/0 B C E D Besøkt: A, B, C, E, D
23
Korrekt DFS B A A 2/2 1/2 1/1 0/0 B C E D Besøkt: A, B, C, E, D
24
Korrekt DFS A A 2/2 1/2 1/1 0/0 B C E D Besøkt: A, B, C, E, D
25
Korrekt DFS A A 2/2 1/1 0/0 B C E D Besøkt: A, B, C, E, D
26
Korrekt DFS A 2/2 1/1 0/0 B C E D Besøkt: A, B, C, E, D
Liknende presentasjoner
© 2024 SlidePlayer.no Inc.
All rights reserved.