Busca: busca linear e busca binária
Para achar um nome numa lista ordenada de um milhão, a busca binária nunca precisa de mais de 20 verificações.
Procurando um valor
Buscar é o problema de achar onde um valor está numa coleção, ou descobrir que ele não está lá. Seu celular faz isso quando você digita o nome de um contato, uma loja faz isso quando confere se um item está em estoque, e um corretor ortográfico faz isso para cada palavra que você digita. A entrada é uma lista e um valor-alvo. A saída é a posição do alvo, ou um sinal como -1, que quer dizer "não encontrado".
Busca linear: um de cada vez
O método mais simples é começar pela esquerda e verificar cada valor por vez, até achar o alvo ou acabar a lista. Isso é a busca linear. Ela funciona em qualquer lista, ordenada ou não. O custo depende da sorte: se o alvo é o primeiro, uma verificação basta; se é o último ou não está lá, você verifica todos os valores. Para uma lista de n valores, o pior caso é n verificações. Uma lista com o dobro do tamanho pode levar o dobro de verificações, e é daí que vem o nome "linear": o trabalho cresce em linha reta com o tamanho.
function linearSearch(list, target) {
for (let i = 0; i < list.length; i++) {
if (list[i] === target) return i; // achou
}
return -1; // verificou tudo
}Busca binária: corte pela metade o que sobra
Se a lista está ordenada, dá para fazer muito melhor. Pense no jogo de adivinhar números: alguém escolhe um número de 1 a 100 e só responde "maior" ou "menor". Um jogador esperto chuta 50 primeiro. Seja qual for a resposta, metade das possibilidades some. O próximo chute é o meio do que sobrou, e assim por diante. A busca binária faz exatamente isso com uma lista ordenada. Ela mantém dois marcadores, lo e hi, em volta da parte em que o alvo ainda pode estar. Ela verifica o valor do meio. Se for o alvo, acabou. Se o valor do meio for menor que o alvo, tudo à esquerda dele também é menor, então lo passa para depois do meio. Se for maior, hi passa para antes do meio. Quando lo ultrapassa hi, não sobra nada e o alvo não está na lista.
function binarySearch(list, target) {
let lo = 0, hi = list.length - 1;
while (lo <= hi) {
const mid = Math.floor((lo + hi) / 2);
if (list[mid] === target) return mid;
if (list[mid] < target) lo = mid + 1; // o alvo está à direita
else hi = mid - 1; // o alvo está à esquerda
}
return -1;
}Arraste para girar. Role ou faça pinça para dar zoom.
Quantas verificações?
Cada verificação da busca binária corta pelo menos pela metade a parte que sobra. Partindo de n valores, depois de uma verificação sobram no máximo cerca de n/2, depois de duas cerca de n/4, e assim por diante até sobrar um valor. O número de cortes pela metade necessários para ir de n até 1 é o logaritmo de n na base 2, escrito log₂ n. Contando também a verificação final, a busca binária precisa de no máximo ⌊log₂ n⌋ + 1 verificações, em que ⌊ ⌋ quer dizer arredondar para baixo. Para 100 valores isso dá 7 verificações, e é por isso que o jogo de adivinhar sempre pode ser vencido em 7 chutes. Para 1000 valores são 10, para um milhão 20 e para um bilhão 30.
| Tamanho da lista n | Busca linear, pior caso | Busca binária, pior caso |
|---|---|---|
| 7 | 7 | 3 |
| 100 | 100 | 7 |
| 1,000 | 1,000 | 10 |
| 1,000,000 | 1,000,000 | 20 |
| 1,000,000,000 | 1,000,000,000 | 30 |
O porém: a lista precisa estar ordenada
A busca binária só funciona porque, numa lista ordenada, uma comparação diz de que lado o alvo tem de estar. Numa lista desordenada, o valor do meio não diz nada sobre os vizinhos, e você volta à busca linear. Ordenar dá trabalho também (as duas próximas unidades tratam disso), então a escolha depende do uso. Se você vai buscar numa lista uma vez só, uma busca linear pode sair mais barata. Se vai buscar na mesma lista milhares de vezes, ordená-la uma vez e depois usar a busca binária compensa rápido. Essa troca entre preparar os dados e responder perguntas sobre eles atravessa a matéria inteira.
lo = mid em vez de lo = mid + 1 pode fazer o laço rodar para sempre quando sobram dois valores, porque mid nunca muda. O valor do meio já foi verificado, então pode ficar de fora do próximo intervalo.| busca linear | Verificar os valores um por um desde o começo |
| busca binária | Verificar o meio de um intervalo ordenado e descartar a metade que não pode conter o alvo |
| pior caso | A entrada que faz o algoritmo trabalhar mais |
| log₂ n | Quantas vezes n pode ser dividido pela metade até chegar a 1 |
| lo e hi | As duas pontas do intervalo em que o alvo ainda pode estar |
| -1 | Um valor de retorno comum que quer dizer "não encontrado" |
- No máximo quantas verificações a busca binária precisa numa lista ordenada de 1000 valores?
- No máximo quantas verificações a busca linear precisa numa lista de 1000 valores?
- A busca binária precisa que a lista esteja
- ordenada
- curta
- formada por números inteiros
- sem valores repetidos
- Na lista [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], quantas verificações a busca binária faz para achar 23?
- Na mesma lista, quantas verificações a busca linear faz para achar 23?
- A busca binária verifica um valor do meio, 40, procurando 25. O que acontece em seguida?
- hi passa para logo antes do meio
- lo passa para logo depois do meio
- a busca para: 25 não está lá
- ela verifica o próximo valor à direita
- Você pode chutar um número de 1 a 100 e ouve "maior" ou "menor". Com a melhor estratégia, quantos chutes sempre bastam?
- Uma lista dobra de tamanho. O que acontece com o número de verificações da busca binária no pior caso?
- Dobra
- Aumenta mais ou menos um
- Fica exatamente igual
- Fica ao quadrado
- Você vai procurar um único valor numa lista desordenada, uma vez. O que sai mais barato?
- Busca linear
- Ordenar a lista e depois fazer busca binária
- Por que
lo = mid(em vez demid + 1) pode fazer a busca binária rodar para sempre?- Com dois valores sobrando, mid pode ficar igual em todas as voltas
- mid fica negativo
- O JavaScript não permite
- A lista fica mais comprida
- No máximo quantas verificações a busca binária precisa para 1 000 000 de valores?
- A busca linear verifica um valor por vez: até n verificações.
- A busca binária corta pela metade o intervalo que sobra: até ⌊log₂ n⌋ + 1 verificações.
- A busca binária só funciona numa lista ordenada.
- Um milhão de valores: no máximo 20 verificações.
- Atualize com mid + 1 e mid − 1 para que o intervalo sempre diminua.
Fontes deste curso (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Data de verificação: 2026-10-17