ALGORITMOS E ESTRUTURAS DE DADOS
# const { resolucao } = await problemas.solucionar()
Algoritmos e estruturas de dados são a base fundamental da ciência da computação. Um algoritmo é uma sequência finita de passos para resolver um problema, enquanto uma estrutura de dados é uma forma de organizar e armazenar informações para que possam ser usadas eficientemente.
A escolha da estrutura de dados e do algoritmo adequado pode significar a diferença entre um programa que roda em segundos e outro que leva dias para executar.
⚙️ PRINCIPAIS ALGORITMOS
Busca Binária
Algoritmo eficiente para encontrar um elemento em uma lista ordenada. Divide repetidamente o intervalo de busca pela metade.
Quick Sort
Algoritmo de ordenação eficiente que usa a estratégia "dividir para conquistar". Escolhe um pivô e particiona o array em elementos menores e maiores.
Dijkstra
Algoritmo para encontrar o caminho mais curto entre nós em um grafo com arestas de peso não negativo. Fundamental para sistemas de navegação.
BFS e DFS
BFS (Breadth-First Search): explora vizinhos primeiro. DFS (Depth-First Search): explora até o fundo antes de voltar.
🗂️ ESTRUTURAS DE DADOS FUNDAMENTAIS
📦 Array (Vetor)
Coleção ordenada de elementos acessíveis por índice. Acesso O(1), inserção/remoção O(n).
🔗 Lista Ligada
Sequência de nós onde cada um aponta para o próximo. Inserção/remoção O(1) no início, busca O(n).
📚 Pilha (Stack)
(LIFO - Last In, First Out)
Operações push (inserir) e pop (remover) apenas no topo. Usada em recursão e undo/redo.
🧍 Fila (Queue)
(FIFO - First In, First Out)
Inserção no final, remoção no início. Usada em processamento de tarefas e buffers.
🌳 Árvore Binária
├─ 3
│ ├─ 1
│ └─ 6
└─ 10
Estrutura hierárquica com raiz e nós filhos. Busca eficiente em árvores balanceadas (O(log n)).
🔑 Tabela Hash
{"nome": "João", "idade": 30}
Mapeia chaves para valores usando função hash. Inserção, remoção e busca O(1) médio.
⏱️ ANÁLISE DE COMPLEXIDADE (Big O)
A notação Big O descreve o comportamento assintótico de um algoritmo em relação ao tamanho da entrada (n).
| Estrutura | Acesso | Busca | Inserção | Remoção |
|---|---|---|---|---|
| Array | O(1) | O(n) | O(n) | O(n) |
| Lista Ligada | O(n) | O(n) | O(1)* | O(1)* |
| Pilha | O(n) | O(n) | O(1)** | O(1)** |
| Fila | O(n) | O(n) | O(1)*** | O(1)*** |
| Árvore Binária | O(log n) | O(log n) | O(log n) | O(log n) |
| Tabela Hash | O(1) | O(1) | O(1) | O(1) |
📊 COMPARAÇÃO DE ALGORITMOS DE ORDENAÇÃO
🫧 Bubble Sort
O(n²) - Simples, mas ineficiente para grandes conjuntos.
⚡ Merge Sort
O(n log n) - Estável, divide e conquista.
🔀 Quick Sort
O(n log n) médio - Muito rápido na prática.
📥 Insertion Sort
O(n²) - Eficiente para dados quase ordenados.
🎯 Problema Real: Busca em Lista Telefônica
Imagine uma lista telefônica com 1 milhão de nomes:
- Busca Linear: Percorre nome por nome → até 1 milhão de comparações (O(n)).
- Busca Binária: Divide a lista repetidamente → no máximo 20 comparações (O(log n)).
📖 GLOSSÁRIO DE ALGORITMOS
"Algoritmos + Estruturas de Dados = Programas"
— Niklaus Wirth