Djupet-först-sökning (DFS)

Datastrukturer och algoritmer i Python

Miriam Antona

Software engineer

Traversering av träd/graf

  • Processen att besöka alla noder
  • Djupet-först-sökning (DFS)
  • Bredden-först-sökning (BFS)
Datastrukturer och algoritmer i Python

Djupet-först-sökning – binära träd

  • In-order
  • Pre-order
  • Post-order
Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster
Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell
Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering

  • Ordning: Vänster -> Aktuell -> Höger

Grafisk representation av in-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

In-order-traversering – implementation

  • Ordning: Vänster -> Aktuell -> Höger
def in_order(self, current_node):

if current_node:
self.in_order(current_node.left_child)
print(current_node.data)
self.in_order(current_node.right_child)
my_tree.in_order(my_tree.root)
10
20
22
65
68
70
75

Grafisk representation av ett binärt sökträd.

  • Komplexitet: $O(n)$
    • $n$ -> antal noder
Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell
Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster
Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering

  • Ordning: Aktuell -> Vänster -> Höger

Grafisk representation av pre-order-traversering över ett binärt sökträd.

Datastrukturer och algoritmer i Python

Pre-order-traversering – implementation

  • Ordning: Rot -> Vänster -> Höger
  def pre_order(self, current_node):
    if current_node:
      print(current_node.data)
      self.pre_order(current_node.left_child)
      self.pre_order(current_node.right_child)
my_tree.pre_order(my_tree.root)
65
20
10
22
70
68
75

Grafisk representation av ett binärt sökträd.

  • Komplexitet: $O(n)$
    • $n$ -> antal noder
Datastrukturer och algoritmer i Python

Post-order

  • Ordning: Vänster
Datastrukturer och algoritmer i Python

Post-order

  • Ordning: Vänster -> Höger
Datastrukturer och algoritmer i Python

Post-order

  • Ordning: Vänster -> Höger -> Aktuell

  • Komplexitet: $O(n)$

    • $n$ -> antal noder
Datastrukturer och algoritmer i Python

När används in-order, pre-order och post-order?

  • in-order

    • används med BST för att hämta nodvärden i stigande ordning
  • pre-order

    • skapa kopior av ett träd
    • hämta prefixuttryck
  • post-order

    • ta bort binära träd
    • hämta postfixuttryck
Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

  • Grafer kan ha cyklar
    • besökta hörn måste spåras
  • Steg:
    1. Börja vid valfritt hörn
    2. Lägg till aktuellt hörn i listan över besökta hörn
    3. För varje grannhörn till aktuell nod
      • Om det är besökt -> ignorera det
      • Om det inte är besökt -> utför DFS rekursivt
Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – grafer

Grafisk representation av djupet-först-sökning över en graf.

Datastrukturer och algoritmer i Python

Djupet-först-sökning – implementation

def dfs(visited_vertices, graph, current_vertex):
    if current_vertex not in visited_vertices:
        print(current_vertex)
        visited_vertices.add(current_vertex)
        for adjacent_vertex in graph[current_vertex]:
            dfs(visited_vertices, graph, adjacent_vertex)
  • Komplexitet: $O(V+E)$
    • $V$ -> antal hörn
    • $E$ -> antal kanter
Datastrukturer och algoritmer i Python

Nu kör vi en övning!

Datastrukturer och algoritmer i Python

Preparing Video For Download...