🚀 Desenvolvido por Luciano Marafona | LEMM.pt

Plataforma de Ensino de Estruturas de Dados e Algoritmos

📚 Teoria de Algoritmos - Catálogo Completo

Ordenação | Estruturas de Dados | Grafos | Programação Dinâmica | IA | Investigação Operacional

📊 Algoritmos de Ordenação
📐 Teorema do Limite Inferior: Qualquer algoritmo de ordenação baseado em comparações tem complexidade Ω(n log n) no pior caso.
MétodoPiorMédioMelhorEstável?In-place?
Insertion SortO(n²)O(n²)Ω(n)
Selection SortO(n²)O(n²)Ω(n²)
Bubble SortO(n²)O(n²)Ω(n)
ShellsortO(n^(3/2))Ω(n log n)
Merge SortO(n log n)Θ(n log n)Ω(n log n)
Quick SortO(n²)Θ(n log n)Ω(n log n)
Heap SortO(n log n)Θ(n log n)Ω(n log n)
Counting SortO(n+k)Θ(n+k)Ω(n+k)
🕸️ Algoritmos em Grafos

🔍 Busca em Largura (BFS)

Explora o grafo por níveis usando uma fila (Queue). Encontra o caminho com menos arestas.

Complexidade: O(V + E)

Aplicação: Redes sociais, web crawling

⬇️ Busca em Profundidade (DFS)

Explora até o fim usando uma pilha (Stack). Útil para deteção de ciclos.

Complexidade: O(V + E)

Aplicação: Ordenação topológica, labirintos

💰 Dijkstra

Encontra o caminho mais curto em grafos com pesos não negativos.

Complexidade: O((V+E) log V)

Aplicação: GPS, redes de computadores

✨ A* (A-Estrela)

f(n) = g(n) + h(n). Usa heurística para guiar a busca.

Completo e Ótimo (com heurística admissível)

Aplicação: Jogos (pathfinding), robótica

💰 Greedy Best-First

Expande o nó com menor h(n). NÃO garante caminho mais curto

Complexidade: O(b^d)

Aplicação: Busca rápida, qualidade não prioritária

💰 Uniform Cost Search (UCS)

Generalização da BFS para grafos com pesos. Expande o nó com menor g(n).

Complexidade: O(b^(1+⌊C*/ε⌋))

🧠 Programação Dinâmica
📐 Princípio: Dividir o problema em subproblemas sobrepostos e guardar as soluções (memoização/tabulação).

🔢 Sequência de Fibonacci

F(n) = F(n-1) + F(n-2)

Sem PD: O(2ⁿ) | Com PD: O(n)

Exemplo clássico de memoização.

💰 Problema do Troco (Coin Change)

dp[i] = min(dp[i - coin] + 1)

Complexidade: O(n × m)

Encontra o número mínimo de moedas.

🎒 Problema da Mochila (Knapsack)

dp[i][w] = max(dp[i-1][w], valor[i] + dp[i-1][w - peso[i]])

Complexidade: O(n × W)

🔤 Maior Subsequência Comum (LCS)

dp[i][j] = dp[i-1][j-1] + 1 se X[i]==Y[j], senão max(dp[i-1][j], dp[i][j-1])

Aplicação: Comparação de DNA, diff de arquivos

✏️ Distância de Edição (Levenshtein)

dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+custo)

Aplicação: Corretores ortográficos, plágio

🗺️ Caminho Mínimo em Grade

dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])

Aplicação: Robótica, navegação

💰 Algoritmos Gulosos (Greedy)

🎯 Problema do Troco (Greedy)

Escolhe sempre a maior moeda que cabe no troco.

✅ Ótimo para moedas canónicas (Euro: 1,2,5,10,20,50)

❌ Falha para moedas [1,6,10] com troco 13

📊 Hill Climbing (Subida da Montanha)

Algoritmo de otimização local. Em cada passo, move-se na direção que aumenta o valor.

⚠️ Pode ficar preso em máximos locais

🌳 Árvores e Percursos

📋 Percursos em Árvores Binárias

  • Pré-ordem: Raiz → Esquerda → Direita
  • Em-ordem: Esquerda → Raiz → Direita
  • Pós-ordem: Esquerda → Direita → Raiz
  • Largura (BFS): Por níveis

Complexidade: O(n) tempo, O(h) espaço

⚖️ Árvores AVL (Autobalanceadas)

Fator de balanceamento = altura(esq) - altura(dir) ∈ {-1, 0, 1}

Rotações: LL, RR, LR, RL

Complexidade: O(log n) para inserção/remoção/busca

🔴 Red-Black Trees

Usadas em TreeMap (Java), std::map (C++)

Propriedades de coloração garantem balanceamento

🏔️ Binary Heap

Árvore quase completa implementada em array.

Pai de arr[i] = arr[⌊(i-1)/2⌋] | Filhos = arr[2i+1], arr[2i+2]

📊 Investigação Operacional

📐 Método Simplex

Resolve problemas de Programação Linear.

Forma padrão: Maximizar Z = cᵀx sujeito a Ax ≤ b, x ≥ 0

Complexidade: O(2ⁿ) pior caso, O(n³) médio

Aplicação: Planeamento de produção, logística, alocação de recursos

🔄 Algoritmos de Transporte

Northwest Corner, Vogel, MODI

Minimizam custo de distribuição de produtos

🌲 Árvore Geradora Mínima (MST)

Kruskal: O(E log E) | Prim: O(E log V)

Aplicação: Redes de telecomunicações, estradas

🌊 Fluxo Máximo

Ford-Fulkerson: O(E·f) | Edmonds-Karp: O(V·E²)

Aplicação: Redes de água, tráfego, internet

🎮 Inteligência Artificial e Jogos

🎯 Minimax

Algoritmo de decisão para jogos de dois jogadores (soma zero).

MAX: maximiza valor | MIN: minimiza valor

Complexidade: O(b^d)

Aplicação: Jogo da Velha, Xadrez, Damas

⚡ Minimax com Poda Alfa-Beta

Otimização que elimina ramos desnecessários.

Complexidade: O(b^(d/2)) no melhor caso

Benefício: Reduz drasticamente o número de nós avaliados

📐 Computação Numérica

📈 Método de Newton-Raphson

Encontra raízes de funções reais.

xₙ₊₁ = xₙ - f(xₙ) / f'(xₙ)

Convergência: Quadrática (número de dígitos corretos dobra)

Aplicação: Engenharia, física, finanças

🐺 Modelo de Lotka-Volterra

Sistema de EDOs para dinâmica predador-presa.

dx/dt = a·x - b·x·y | dy/dt = -c·y + d·x·y

Método de Heun: Runge-Kutta 2ª ordem

🔑 Hashing - Tabelas de Dispersão
📐 Hash function: h(k) = k mod m | Fator de carga: λ = n/m

🔗 Chaining (Encadeamento)

Cada slot contém uma lista. Inserção O(1), busca O(λ).

Custo médio: ≈ λ/2 para busca com sucesso

📍 Open Addressing (Endereçamento Aberto)

Linear Probing: O(1 + 1/(1-λ)²)

Double Hashing: O(1/(1-λ))

⚠️ Performance degrada quando λ → 1

💡 Birthday Problem: Primeira colisão esperada com ≈ √(πm/2) elementos. Para m=365, primeira colisão com ≈ 24 elementos!
📋 Resumo das Complexidades por Estrutura
EstruturaBuscaInserçãoRemoçãoObservação
Lista não ordenadaO(n)O(1)O(n)
Lista ordenada (array)O(log n)O(n)O(n)Busca binária
BST (não balanceada)O(n) piorO(n) piorO(n) piorDegenera para lista
AVL / Red-BlackO(log n)O(log n)O(log n)Balanceada
Hash Table (chaining)O(1) médioO(1) médioO(1) médioλ constante
Hash Table (open addressing)O(1/(1-λ)) médioO(1/(1-λ)) médioO(1/(1-λ)) médioClustering
Heap BinárioO(log n)O(log n)Extrai máximo
Fila (Queue)O(1)O(1)FIFO
Pilha (Stack)O(1)O(1)LIFO