Resumo do Semestre
Teoria de Grafos
Grafos representam relações. Em software, usamos para mapas, redes sociais e fluxos de dados.
| Algoritmo | Explicação Simples | Exemplo no Mundo Real |
|---|---|---|
| 1.1 Busca (BFS/DFS) | BFS explora em camadas; DFS explora caminhos até o fim. | BFS: Achar amigos de 1º grau no LinkedIn. |
| 1.2 Menor Caminho | Encontrar a rota com menor custo total. | Rotas de entrega de comida. |
| 1.3 Comp. Conectados | Identificar grupos isolados em uma rede. | Identificar "bolhas" de usuários em redes sociais. |
| 1.4 Detecção de Ciclos | Verificar se um caminho volta ao início. | Evitar loops infinitos em chamadas de funções. |
| 1.5 Ord. Topológica | Ordenar tarefas com dependências. | O Gradle/Maven decidindo a ordem de compilação. |
| 1.6 SCC (Fort. Conectados) | Grupos onde todos se alcançam (direcionado). | Analisar grupos de sites que linkam entre si (SEO). |
| 1.7 Dijkstra | Menor caminho com pesos positivos. | Google Maps: Caminho mais rápido para o trabalho. |
| 1.8 Algoritmo A* | Dijkstra com uma "bússola" (heurística). | IA de Jogos: NPC encontrando o jogador no mapa. |
| 1.9 Árvore Geradora (MST) | Conectar todos os nós gastando o mínimo. | Passar fibra ótica em um bairro com o menor custo. |
Algoritmos Ambiciosos (Greedy)
Fazem a melhor escolha local a cada passo. São rápidos e ocupam pouca memória.
- 2.1 Mochila (Fracionária): Pegar o máximo de valor possível dividindo itens.
- Exemplo: Encher um caminhão de grãos priorizando o mais caro por quilo.
- 2.2/2.3 Interval Scheduling/Partitioning: Organizar tarefas em horários.
- Exemplo: Sistema de reserva de salas de reunião para evitar conflitos.
- 2.4 Atraso Máximo: Minimizar o pior atraso possível.
- Exemplo: Escalonar entregas para que nenhum cliente espere demais.
- 2.5 Caminhoneiro: Parar para abastecer apenas quando necessário.
- Exemplo: Logística de veículos elétricos calculando pontos de recarga.
- 2.6 Caixa (Moedas): Dar o troco usando o menor número de moedas.
- Exemplo: Um caixa eletrônico dispensando notas de 100 antes das de 20.
- 2.7 Huffman: Reduzir o tamanho de dados sem perder informação.
- Exemplo: Compressão de arquivos
.zipou imagens.jpeg.
- Exemplo: Compressão de arquivos
Dividir e Conquistar
Quebrar um problema grande em menores, resolver e combinar os resultados.
- 3.1 Merge/Quicksort: Ordenação de dados.
- Exemplo: Organizar uma lista de 1 milhão de usuários por nome.
- 3.2 Contagem de Inversões: Medir o quão "fora de ordem" está algo.
- Exemplo: Comparar o ranking de filmes de dois usuários para dar recomendações.
- 3.3 Mediana das Medianas: Achar o elemento central de forma rápida.
- Exemplo: Calcular estatísticas de performance de um servidor em tempo real.
- 3.4 Par de Pontos Próximos: Achar a menor distância entre muitos pontos.
- Exemplo: Sistemas de colisão em jogos ou radares aéreos.
- 3.5 Karatsuba / 3.6 Strassen: Multiplicação ultra-veloz.
- Exemplo: Criptografia pesada (RSA) ou processamento de imagens (Matrizes).
Programação Dinâmica (PD)
Resolver cada subproblema uma única vez e guardar o resultado (memoization).
- 4.1 Scheduling com Pesos: Escolher tarefas que dão mais lucro, não apenas as mais curtas.
- Exemplo: Selecionar quais anúncios exibir em um site para lucrar mais.
- 4.2 Maior Subsequência: Achar padrões em sequências.
- Exemplo: Previsão de tendências em gráficos de ações.
- 4.3 Mochila (0/1): Decidir se leva ou não um item inteiro.
- Exemplo: Otimizar o espaço de um servidor para hospedar as aplicações mais rentáveis.
- 4.4 Selos/Troco: Resolver troco para sistemas de moedas estranhas.
- Exemplo: Sistemas de pagamento internacionais com regras complexas.
- 4.5 Alinhamento de Sequências: Comparar textos ou códigos.
- Exemplo: O comando
git diffcomparando suas alterações no código.
- Exemplo: O comando
- 4.6 Bellman-Ford: Menor caminho lidando com custos negativos.
- Exemplo: Protocolos de rede que detectam links que "gastam" energia ou crédito.