Corte o espaço de busca pela metade com busca binária
Busque em dados ordenados - ou em qualquer condição monotônica - em O(log n).
- Escrever uma busca binária sem bugs.
- Encontrar a primeira posição em que uma condição fica verdadeira.
- Reconhecer a busca binária sobre respostas, não só sobre arrays.
A busca binária corta repetidamente pela metade um espaço de busca ordenado: compare o elemento do meio e descarte a metade que não pode conter a resposta. Um milhão de itens leva cerca de 20 passos. Além de encontrar um valor num array ordenado, ela resolve qualquer problema em que uma condição de sim/não muda exatamente uma vez - “a primeira versão com defeito”, “a menor capacidade que entrega todos os pacotes em D dias”.
Um modelo que evita bugs de off-by-one
Use um intervalo semiaberto [low, high) e encontre o primeiro índice em que uma condição é verdadeira:
- Comece com
low = 0,high = len(nums). - Enquanto
low < high: peguemid = (low + high) // 2. - Se a condição vale em
mid, a resposta está emmidou à esquerda dele:high = mid. Caso contrário, está à direita:low = mid + 1. - Quando o laço termina,
lowé o primeiro índice em que a condição vale (oulen(nums), se nenhum valer).
1def first_at_least(nums, target):
2 low, high = 0, len(nums)
3 while low < high:
4 mid = (low + high) // 2
5 if nums[mid] >= target:
6 high = mid
7 else:
8 low = mid + 1
9 return low
10
11nums = [1, 3, 5, 7, 9]
12print(first_at_least(nums, 5), first_at_least(nums, 6), first_at_least(nums, 10))2 3 5
Essa busca de “limite inferior” responde várias perguntas de uma vez: se o alvo existe (low < len(nums) and nums[low] == target), onde inseri-lo para manter a lista ordenada e quantos elementos são menores que ele. O bisect.bisect_left do Python implementa exatamente isso.
Principais conclusões
A busca binária precisa de dados ordenados ou de uma condição que muda uma única vez.
Use sempre o mesmo modelo; a versão semiaberta encontra a primeira posição verdadeira.
Você pode fazer busca binária sobre as respostas possíveis, não só sobre índices.
Quiz da aula
5 perguntas · aprovação com 4 acertos · até 50 XP
Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.
Pratique: resolva problemas de entrevistas técnicas
Resolva um problema clássico de entrevista em Python e execute-o com casos de teste. Busque a complexidade ideal e depois confira os casos extremos. Os exercícios rodam localmente no navegador.
Encontre a posição de inserção
Leia uma linha de inteiros distintos em ordem crescente e depois um alvo. Imprima o índice do alvo, se ele estiver presente; caso contrário, o índice em que ele seria inserido para manter a lista ordenada. Use busca binária.
- Alvo presente
- Inserir no meio
- Inserir no fim
- Inserir no início
O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.
Dúvidas sobre esta lição
Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.
Carregando publicações…