Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Korrekt dybde først-søk Åsmund Eldhuset asmunde *at* stud.ntnu.no www.stud.ntnu.no/~asmunde/dfs.ppt.

Liknende presentasjoner


Presentasjon om: "Korrekt dybde først-søk Åsmund Eldhuset asmunde *at* stud.ntnu.no www.stud.ntnu.no/~asmunde/dfs.ppt."— 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 BCE D A Besøkt: A

8 Gal DFS A B CE D BCBC Besøkt: A, B

9 Gal DFS A BCE D DCDC Besøkt: A, B, D

10 Gal DFS A BC E D ECEC Besøkt: A, B, D, E

11 Gal DFS A B C E D C Besøkt: A, B, D, E, C

12 Gal DFS A BCE 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 BCE D A Besøkt: A 0/2 0/10/0 0/1

16 Korrekt DFS A B CE D BABA Besøkt: A, B 0/2 1/2 0/10/0 0/1

17 Korrekt DFS A B C E D CBACBA Besøkt: A, B, C 1/2 0/10/0 0/1

18 Korrekt DFS A BC E D ECBAECBA Besøkt: A, B, C, E 1/2 1/10/0 0/1

19 Korrekt DFS A B C E D CBACBA Besøkt: A, B, C, E 1/2 1/10/0 0/1

20 Korrekt DFS A B CE D BABA Besøkt: A, B, C, E 1/2 1/10/0 0/1

21 Korrekt DFS A BCE D DBADBA Besøkt: A, B, C, E, D 2/2 1/2 1/10/0 0/1

22 Korrekt DFS A BCE D DBADBA Besøkt: A, B, C, E, D 2/2 1/2 1/10/0 1/1

23 Korrekt DFS A B CE D BABA Besøkt: A, B, C, E, D 2/2 1/2 1/10/0 1/1

24 Korrekt DFS A BCE D A Besøkt: A, B, C, E, D 2/2 1/2 1/10/0 1/1

25 Korrekt DFS A BCE D A Besøkt: A, B, C, E, D 2/2 1/10/0 1/1

26 Korrekt DFS A BCE D Besøkt: A, B, C, E, D 2/2 1/10/0 1/1


Laste ned ppt "Korrekt dybde først-søk Åsmund Eldhuset asmunde *at* stud.ntnu.no www.stud.ntnu.no/~asmunde/dfs.ppt."

Liknende presentasjoner


Annonser fra Google