Căutarea în adâncime (DFS)

Structuri de date și algoritmi în Python

Miriam Antona

Software engineer

Parcurgerea arborilor/grafurilor

  • Procesul de vizitare a tuturor nodurilor
  • Căutare în adâncime (DFS)
  • Căutare în lățime (BFS)
Structuri de date și algoritmi în Python

Căutare în adâncime - arbori binari

  • În ordine
  • Pre-ordine
  • Post-ordine
Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga
Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent
Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine

  • Ordine: Stânga -> Curent -> Dreapta

Reprezentare grafică a parcurgerii în ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în ordine - implementare

  • Ordine: Stânga -> Curent -> Dreapta
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

Reprezentare grafică a unui arbore binar de căutare.

  • Complexitate: $O(n)$
    • $n$ -> numărul de noduri
Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent
Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga
Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine

  • Ordine: Curent -> Stânga -> Dreapta

Reprezentare grafică a parcurgerii în pre-ordine pe un arbore binar de căutare.

Structuri de date și algoritmi în Python

Parcurgere în pre-ordine - implementare

  • Ordine: Rădăcină -> Stânga -> Dreapta
  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

Reprezentare grafică a unui arbore binar de căutare.

  • Complexitate: $O(n)$
    • $n$ -> numărul de noduri
Structuri de date și algoritmi în Python

Post-ordine

  • Ordine: Stânga
Structuri de date și algoritmi în Python

Post-ordine

  • Ordine: Stânga -> Dreapta
Structuri de date și algoritmi în Python

Post-ordine

  • Ordine: Stânga -> Dreapta -> Curent

  • Complexitate: $O(n)$

    • $n$ -> numărul de noduri
Structuri de date și algoritmi în Python

Când să folosiți în ordine, pre-ordine și post-ordine

  • în ordine

    • folosit în BST pentru a obține valorile nodurilor în ordine crescătoare
  • pre-ordine

    • copierea unui arbore
    • obținerea expresiilor prefix
  • post-ordine

    • ștergerea arborilor binari
    • obținerea expresiilor postfix
Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

  • Grafurile pot conține cicluri
    • este necesar să urmăriți vârfurile vizitate
  • Pași:
    1. Începeți de la orice vârf
    2. Adăugați vârful curent în lista vizitate
    3. Pentru fiecare vârf adiacent nodului curent
      • Dacă a fost vizitat -> ignorați-l
      • Dacă nu a fost vizitat -> aplicați DFS recursiv
Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - grafuri

Reprezentare grafică a căutării în adâncime pe un graf.

Structuri de date și algoritmi în Python

Căutare în adâncime - implementare

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)
  • Complexitate: $O(V+E)$
    • $V$ -> numărul de vârfuri
    • $E$ -> numărul de muchii
Structuri de date și algoritmi în Python

Să exersăm!

Structuri de date și algoritmi în Python

Preparing Video For Download...