1 / 26

Korrekt dybde først-søk

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å

lel
Download Presentation

Korrekt dybde først-søk

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  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. 0/2 0/2 0/1 0/0 0/1 Korrekt DFS A A B C E D Besøkt: A

  16. 1/2 0/2 0/1 0/0 0/1 Korrekt DFS B A A B C E D Besøkt: A, B

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

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

More Related