FAQ / Tirar dúvidas ❓
Perguntas frequentes que cruzam vários capítulos. Para dúvidas específicas, veja a seção "Dúvidas comuns" de cada capítulo — e use a busca no topo.
Conceitos gerais
Por que eu preciso aprender Big-O?
Porque ele te diz se um programa vai continuar rápido quando os dados crescerem. Dois algoritmos podem parecer iguais com 10 itens e um ser inviável com 1 milhão. Big-O é a linguagem para comparar algoritmos sem depender da máquina. Veja o cheatsheet.
Qual a diferença entre tempo e espaço (de complexidade)?
Tempo = quantas operações o algoritmo faz. Espaço = quanta memória extra ele usa. Às vezes você troca um pelo outro: a programação dinâmica gasta memória (tabela) para economizar tempo.
Recursão ou loop (iteração) — qual usar?
Os dois resolvem os mesmos problemas. Recursão costuma deixar o código mais legível quando o problema é naturalmente "auto-similar" (dividir para conquistar, árvores). Loops costumam ser mais eficientes em memória (não enchem a pilha de chamadas). Veja o cap. 3.
Array ou lista ligada?
Array: acesso por índice em O(1), mas inserir/remover no meio é O(n). Lista ligada: inserir/remover é O(1) (se você já está no ponto), mas acessar o i-ésimo elemento é O(n). Escolha pelo que você mais faz: ler ou modificar. Veja o cap. 2.
Ordenação e busca
Por que a busca binária exige a lista ordenada?
Porque ela decide "ir para a esquerda ou direita" comparando com o elemento do meio. Isso só funciona se os elementos estiverem em ordem. Sem ordenação, use busca linear (O(n)). Veja o cap. 1.
Quicksort é O(n log n) ou O(n²)?
Depende do pivô. No caso médio (pivô razoável) é O(n log n). No pior caso (pivô sempre o menor/maior, ex.: lista já ordenada com pivô na ponta) vira O(n²). Escolher um pivô aleatório evita o pior caso na prática. Veja o cap. 4.
Por que quicksort é preferido a selection sort?
Selection sort é sempre O(n²). Quicksort é O(n log n) no caso médio — muito
mais rápido para listas grandes. Para n = 1000, isso é ~10 000 vs. ~1 milhão
de operações.
Grafos
BFS ou Dijkstra — qual usar?
Dijkstra funciona com pesos negativos?
Não. Com arestas de peso negativo, use Bellman-Ford. Dijkstra assume que adicionar uma aresta nunca diminui o custo total.
Técnicas avançadas
Quando um problema é 'guloso' e quando é 'programação dinâmica'?
O que significa 'NP-completo'?
São problemas para os quais não se conhece algoritmo rápido (polinomial) que sempre dê a resposta ótima. Sinais: precisa testar todas as combinações, o problema envolve "todos os subconjuntos/permutações". Solução prática: usar algoritmos gulosos para uma boa aproximação. Veja o cap. 8.
Sobre o estudo
Em que ordem devo estudar?
Na ordem dos capítulos — eles se constroem uns sobre os outros (recursão antes de quicksort; grafos antes de Dijkstra). Veja o guia de estudos.
Não entendi um capítulo. E agora?
Releia a "Analogia", refaça o código digitando, e tente explicar em voz alta. Se travar num termo, consulte o glossário. Muitas dúvidas já estão respondidas na seção "Dúvidas comuns" do próprio capítulo.