edubun
Português

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;
}
Carregando

Arraste para girar. Role ou faça pinça para dar zoom.

Uma lista ordenada de 31 números. Escolha um alvo, avance passo a passo na busca binária e na busca linear e compare o número de verificações.

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 nBusca linear, pior casoBusca binária, pior caso
773
1001007
1,0001,00010
1,000,0001,000,00020
1,000,000,0001,000,000,00030

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.

Um deslize clássico na busca binária é o passo de atualização. Escrever 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 linearVerificar os valores um por um desde o começo
busca bináriaVerificar o meio de um intervalo ordenado e descartar a metade que não pode conter o alvo
pior casoA entrada que faz o algoritmo trabalhar mais
log₂ nQuantas vezes n pode ser dividido pela metade até chegar a 1
lo e hiAs duas pontas do intervalo em que o alvo ainda pode estar
-1Um valor de retorno comum que quer dizer "não encontrado"
  1. No máximo quantas verificações a busca binária precisa numa lista ordenada de 1000 valores?
  2. No máximo quantas verificações a busca linear precisa numa lista de 1000 valores?
  3. A busca binária precisa que a lista esteja
    • ordenada
    • curta
    • formada por números inteiros
    • sem valores repetidos
  4. Na lista [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], quantas verificações a busca binária faz para achar 23?
  5. Na mesma lista, quantas verificações a busca linear faz para achar 23?
  6. 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
  7. Você pode chutar um número de 1 a 100 e ouve "maior" ou "menor". Com a melhor estratégia, quantos chutes sempre bastam?
  8. 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
  9. 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
  10. Por que lo = mid (em vez de mid + 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
  11. No máximo quantas verificações a busca binária precisa para 1 000 000 de valores?
Pontos-chave
  • 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