Capítulo 1 — Introdução e busca binária 🔍
Ideia central
Este capítulo apresenta o que é um algoritmo e como medir sua velocidade com a notação Big-O. O exemplo estrela é a busca binária: para encontrar um item numa lista ordenada, você corta a lista pela metade a cada passo, em vez de olhar item por item.
Analogia
Procurar "Silva" numa lista telefônica. A busca linear começa na primeira página e vai virando uma a uma. A busca binária abre no meio: "Silva vem antes ou depois daqui?" e descarta metade da lista de uma vez. Com 1 milhão de nomes, a linear pode levar 1 milhão de passos; a binária leva ~20.
Como funciona
A busca binária trabalha com baixo e alto (os limites da parte ainda não
descartada) e olha o elemento do meio:
- Calcule o
meioentrebaixoealto. - Se o chute do meio é o item → achou.
- Se o chute é maior que o item → o item está à esquerda (
alto = meio - 1). - Se o chute é menor → o item está à direita (
baixo = meio + 1). - Repita até
baixo > alto(não achou).
Implementação em Python
Código em
chapter01/binarySearch.py.
def pesquisaBinaria(lista, item):
baixo = 0
alto = len(lista) - 1
while baixo <= alto:
meio = (baixo + alto) // 2 # índice do meio (divisão inteira)
chute = lista[meio]
if chute == item:
return meio # achou: retorna a posição
if chute > item:
alto = meio - 1 # item está na metade de baixo
else:
baixo = meio + 1 # item está na metade de cima
return None # item não está na lista
minhaLista = [1, 3, 5, 7, 9]
print(pesquisaBinaria(minhaLista, 3)) # 1
print(pesquisaBinaria(minhaLista, -1)) # None
A busca binária só funciona em listas ordenadas. Se a sua lista não está ordenada, ou você ordena antes, ou usa busca linear.
Complexidade (Big-O)
- Busca binária: tempo O(log n), espaço O(1).
- Busca linear: tempo O(n).
log₂ n é o número de vezes que dá para dividir n por 2 até chegar a 1.
Para 1.024 itens são ~10 passos; para 1 bilhão, ~30. Veja o
cheatsheet de Big-O.
Dúvidas comuns
Por que `meio = (baixo + alto) // 2` usa `//`?
// é divisão inteira em Python: índice de lista precisa ser inteiro.
7 // 2 == 3. Com / viria 3.5, que não serve como índice.
O que acontece se o item não estiver na lista?
Os limites baixo e alto se aproximam até baixo > alto. O while para e
a função retorna None.
Por que O(log n) é tão melhor que O(n)?
Porque dobrar a entrada adiciona apenas um passo na busca binária, mas
dobra o trabalho da busca linear. A diferença explode com n grande.
Exercícios
1.1 — Lista de 128 nomes: quantos passos no máximo?
log₂ 128 = 7. No máximo 7 passos.
1.2 — E se a lista dobrar para 256 nomes?
log₂ 256 = 8. Apenas 8 passos — só +1 ao dobrar a lista.
1.3 — Big-O da busca linear no pior caso?
O(n) — pode ser preciso olhar todos os n elementos.
Checklist de domínio
- Sei explicar a diferença entre busca linear e binária.
- Consigo implementar a busca binária de memória.
- Sei por que a lista precisa estar ordenada.
- Sei dizer e justificar o Big-O de ambas as buscas.
- Entendo a intuição de
O(log n).