Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Korrekt dybde først-søk

Liknende presentasjoner


Presentasjon om: "Korrekt dybde først-søk"— Utskrift av presentasjonen:

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


Laste ned ppt "Korrekt dybde først-søk"

Liknende presentasjoner


Annonser fra Google