8 min

Topological Sort

Ordena vértices de um grafo direcionado acíclico (DAG) de forma que para toda aresta u->v, u aparece antes de v.

DifícilO(V + E) / O(V)GrafoDAGOrdenaçãoDFSKahn

Visualizador Interativo

Topological Sort (Kahn)Passo 1 / 34
Processando
Ordenado
Na fila
Ordem Topologica
Nenhum vertice ordenado ainda
Velocidade:800ms
Historico de Passos
#0Iniciando Topological Sort (Algoritmo de Kahn)

Como Funciona

Topological Sort ordena vértices de um DAG (Directed Acyclic Graph) de forma que todas as dependências aparecem antes dos vértices que dependem delas. É como ordenar tarefas onde algumas precisam ser feitas antes de outras. Existem duas abordagens clássicas: Algoritmo de Kahn (BFS): Começa pelos vértices sem dependências (grau de entrada = 0) e vai removendo-os do grafo, atualizando os graus dos vizinhos. Quando um vizinho fica com grau 0, ele entra na fila. DFS com pós-ordem: Faz DFS normal, mas adiciona cada vértice ao resultado DEPOIS de visitar todos os vizinhos. No final, inverte o resultado. Ambos detectam ciclos: Kahn verifica se processou todos os vértices; DFS usa coloração para detectar back edges.

Vértices sem dependências (grau de entrada 0) podem ser processados imediatamente. Ao processá-los, liberamos seus dependentes.

Passo a Passo

  1. Calcule o grau de entrada de cada vértice
  2. Adicione vértices com grau 0 a uma fila
  3. Remova um vértice da fila e adicione ao resultado
  4. Decremente o grau de entrada de todos os vizinhos
  5. Se algum vizinho ficar com grau 0, adicione à fila
  6. Repita até a fila esvaziar
  7. Se sobrar vértices, o grafo tem ciclo

Análise de Complexidade

⏱️Tempo
O(V + E)

Cada vértice é processado uma vez, cada aresta é examinada uma vez.

Ver prova

Calculamos grau de entrada em O(E), processamos cada vértice uma vez e cada aresta uma vez ao atualizar graus.

💾Espaco
O(V)

Armazenamos graus de entrada e a fila, ambos O(V).

🎯Melhor Caso
O(V + E)

Sempre precisamos examinar todo o grafo.

⚠️Pior Caso
O(V + E)

Mesmo com ciclo, detectamos após processar o grafo.

Comparação com Outros Algoritmos

AlgoritmoTempoEspacoMelhor Para
Kahn (BFS)(atual)O(V + E)O(V)Detectar ciclos facilmente, processar em paralelo
DFS pós-ordem(atual)O(V + E)O(V)Implementação simples se já tem DFS

Dicas e Erros Comuns

  • Não verificar se o grafo tem ciclo (topological sort só existe para DAGs)
  • Esquecer de decrementar o grau de entrada dos vizinhos
  • Confundir com ordenação comum de arrays
  • Assumir que existe apenas uma ordenação válida (geralmente existem várias)

Perguntas de Entrevista

Pratique respondendo a perguntas comuns de entrevistas tecnicas. Clique em uma pergunta para iniciar uma sessao de pratica com IA.

Implementacao

python
1from collections import dequeInicializar Fila
2
3
4def topological_sort_kahn(graph):Definição
5 # Calcular grau de entrada
6 in_degree = {v: 0 for v in graph}Calcular Grau de Entrada
7 for v in graph:Calcular Grau de Entrada
8 for neighbor in graph[v]:Calcular Grau de Entrada
9 in_degree[neighbor] += 1Calcular Grau de Entrada
10
11 # Vertices sem dependencias
12 queue = deque([v for v in graph if in_degree[v] == 0])Inicializar Fila
13 result = []
14
15 while queue:Loop Principal
16 v = queue.popleft()Desenfileirar
17 result.append(v)Desenfileirar
18
19 for neighbor in graph[v]:Processar Vizinhos
20 in_degree[neighbor] -= 1Processar Vizinhos
21 if in_degree[neighbor] == 0:Verificar Grau Zero
22 queue.append(neighbor)Verificar Grau Zero
23
24 if len(result) != len(graph):Verificar Ciclo
25 return None # Ciclo detectadoVerificar Ciclo
26
27 return result
28
29
30def topological_sort_dfs(graph):Definição
31 visited = set()
32 result = []
33
34 def dfs(v):Visitar DFS
35 visited.add(v)
36 for neighbor in graph[v]:Visitar DFS
37 if neighbor not in visited:Visitar DFS
38 dfs(neighbor)Visitar DFS
39 result.append(v)Pós-Ordem
40
41 for v in graph:
42 if v not in visited:
43 dfs(v)
44
45 return result[::-1]Pós-Ordem
46