Prohledávání do hloubky (DFS)

Datové struktury a algoritmy v Pythonu

Miriam Antona

Software engineer

Procházení stromů/grafů

  • Proces procházení všech uzlů
  • Prohledávání do hloubky (DFS)
  • Prohledávání do šířky (BFS)
Datové struktury a algoritmy v Pythonu

DFS – binární stromy

  • In-order
  • Pre-order
  • Post-order
Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý
Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální
Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order

  • Pořadí: Levý -> Aktuální -> Pravý

Grafické znázornění průchodu in-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod in-order – implementace

  • Pořadí: Levý -> Aktuální -> Pravý
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

Grafické znázornění binárního vyhledávacího stromu.

  • Složitost: $O(n)$
    • $n$ -> počet uzlů
Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální
Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý
Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order

  • Pořadí: Aktuální -> Levý -> Pravý

Grafické znázornění průchodu pre-order nad binárním vyhledávacím stromem.

Datové struktury a algoritmy v Pythonu

Průchod pre-order – implementace

  • Pořadí: Kořen -> Levý -> Pravý
  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

Grafické znázornění binárního vyhledávacího stromu.

  • Složitost: $O(n)$
    • $n$ -> počet uzlů
Datové struktury a algoritmy v Pythonu

Post-order

  • Pořadí: Levý
Datové struktury a algoritmy v Pythonu

Post-order

  • Pořadí: Levý -> Pravý
Datové struktury a algoritmy v Pythonu

Post-order

  • Pořadí: Levý -> Pravý -> Aktuální

  • Složitost: $O(n)$

    • $n$ -> počet uzlů
Datové struktury a algoritmy v Pythonu

Kdy použít in-order, pre-order a post-order

  • in-order

    • BST pro získání hodnot uzlů ve vzestupném pořadí
  • pre-order

    • vytváření kopií stromu
    • získání prefixových výrazů
  • post-order

    • mazání binárních stromů
    • získání postfixových výrazů
Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

  • Grafy mohou obsahovat cykly
    • je nutné sledovat navštívené vrcholy
  • Postup:
    1. Začít v libovolném vrcholu
    2. Přidat aktuální vrchol do seznamu navštívených
    3. Pro každý sousední vrchol aktuálního uzlu
      • Pokud byl navštíven -> ignorovat
      • Pokud nebyl navštíven -> rekurzivně provést DFS
Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – grafy

Grafické znázornění prohledávání do hloubky nad grafem.

Datové struktury a algoritmy v Pythonu

Prohledávání do hloubky – implementace

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)
  • Složitost: $O(V+E)$
    • $V$ -> počet vrcholů
    • $E$ -> počet hran
Datové struktury a algoritmy v Pythonu

Lass uns üben!

Datové struktury a algoritmy v Pythonu

Preparing Video For Download...