Por que a pesquisa binária, que precisa de dados classificados, é considerada melhor que a pesquisa linear?

20

Eu sempre ouvi dizer que a pesquisa linear é uma abordagem ingênua e a pesquisa binária é melhor do que no desempenho devido à melhor complexidade assintótica. Mas nunca entendi por que é melhor que a pesquisa linear quando a classificação é necessária antes da pesquisa binária?

A pesquisa linear é O(n)e a pesquisa binária é O(log n). Essa parece ser a base para dizer que a pesquisa binária é melhor. Mas a pesquisa binária exige uma classificação, que é O(n log n)dos melhores algoritmos. Portanto, a pesquisa binária não deve ser realmente mais rápida , pois exige classificação.

Estou lendo o CLRS, no qual o autor sugere que, na classificação por inserção, em vez de usar a abordagem de pesquisa linear ingênua, é melhor usar a pesquisa binária para encontrar o local onde o item deve ser inserido. Nesse caso, isso parece ser justificado, pois em cada iteração de loop há uma lista classificada na qual a pesquisa binária pode ser aplicada. Mas no caso geral em que não há garantia sobre o conjunto de dados em que precisamos pesquisar, a utilização da pesquisa binária não é realmente pior que a pesquisa linear devido a requisitos de classificação?

Existem considerações práticas que estou negligenciando que tornam a pesquisa binária melhor que a pesquisa linear? Ou a pesquisa binária é considerada melhor que a pesquisa linear sem considerar o tempo de computação necessário para a classificação?

Aseem Bansal
fonte
6
Tal como acontece com tantas outras coisas, tudo se resume a: "Depende ...;)"
Jeff B
Se a lista já estiver classificada, você acha que a pesquisa linear ainda é melhor? Isso pode ser algo a considerar aqui.
JB King
3
Para quem pensa em mudar o título , não retire a parte sobre os dados classificados, porque remover isso faz com que pareça uma pergunta completamente diferente.
Aseem Bansal

Respostas:

53

Há algumas considerações práticas que estou ignorando que tornam a pesquisa binária melhor que a pesquisa linear?

Sim - você precisa fazer a classificação O (n log n) apenas uma vez e, em seguida, pode fazer a pesquisa binária O (log n) quantas vezes quiser, enquanto a pesquisa linear é O (n) toda vez.

Obviamente, isso é apenas uma vantagem se você realmente fizer várias pesquisas nos mesmos dados. Mas os cenários "escreva uma vez, leia com frequência" são bastante comuns.

Michael Borgwardt
fonte
Se você estiver fazendo algo apenas uma vez, não há muito sentido em otimizá-lo.
14

A suposição básica é que você não faz uma pesquisa.

Portanto, se você precisar pesquisar os mesmos dados várias vezes, precisará classificar apenas uma vez e poderá lucrar com a pesquisa binária.

Se você pesquisar com frequência e alterar dados, vale a pena usar uma lista classificada em que novas entradas são classificadas na lista.

Então, basicamente, a pesquisa binária é melhor quando você pesquisa a mesma lista várias vezes sem a necessidade de recorrer.

Quando você precisa classificar todas as vezes antes de pesquisar, não há vantagem.

Por favor, note que existem algoritmos de classificação que são muito rápidos quando a lista já está classificada (ou quase classificada). A maioria das determinações de desempenho espera uma lista não classificada.

Uwe Plonus
fonte
2
Se você pesquisar e inserir com frequência, poderá procurar estruturas de dados mais complicadas (por exemplo, árvores binárias).
10133 MarkJ
@ MarkJ, a pergunta básica do pôster original era sobre pesquisar em uma lista. Senão, eu concordo completamente com você.
Uwe Plonus
7

porque uma vez que você tenha uma lista classificada, não será necessário reorganizá-la toda vez, o que significa que, se você tiver mais de O (log n) pesquisas ordenadas com antecedência, obterá um ganho ganho ( O(n log n + k log n)vsO(k*n)

catraca arrepiante
fonte
5

Imagine duas listas telefônicas.

Uma lista telefônica tem os nomes em ordem alfabética. Para encontrar a entrada desejada, abra no meio, marque a entrada e avance ou retroceda, dependendo de você ultrapassar ou ultrapassar.

A outra lista telefônica tem os nomes em ordem aleatória. Para encontrar a entrada desejada, comece do início e continue até encontrar o que deseja.

O segundo livro funcionará em qualquer cidade de tamanho razoável?

Gort the Robot
fonte
3

Eu acho que o valor da pesquisa binária sobre a pesquisa linear é contextual. Se você começar com um enorme conjunto de dados não ordenados e planeja extrair apenas um pequeno número de itens, a classificação e a execução de uma pesquisa binária serão lentas. Se, no entanto, você mantiver uma lista ordenada durante toda a vida útil do aplicativo e acessá-la regularmente, a pesquisa binária é um caminho muito melhor a seguir.

Amish Programmer
fonte
3

Como muitas outras pessoas responderam, a pesquisa binária é realmente preferível, porque a etapa de classificação pode ser feita apenas uma vez e a pesquisa real pode ser feita quantas vezes você desejar. No entanto, para certos valores de n (isto é, certos tamanhos de entrada), a pesquisa binária é sempre mais executada que a pesquisa linear (mesmo para uma única execução).

O "ponto de inflexão" é calculado resolvendo a equação de complexidade assintótica:

n log n + log n = n

Como você pode ver no Wolfram Alpha, existe um valor numérico para n que garante que a pesquisa e a classificação binárias sejam sempre mais rápidas que a pesquisa linear sozinha. Obviamente, o valor real de n que funciona no seu caso depende de muitos fatores que podem ser difíceis de estimar.

De acordo com este interessante artigo de Mark Probst, que inclui algumas boas medições de desempenho em profundidade nos processadores atuais:

Se você precisar pesquisar em uma matriz classificada de números inteiros e o desempenho for realmente muito importante, use a pesquisa linear se sua matriz tiver menos de 64 elementos em tamanho, pesquisa binária se estiver acima.

LorenzCK
fonte
2

Nas palavras do leigo:

Se você tiver uma lista não ordenada com dez bilhões de itens, e o item que estiver procurando for o último, você terminará lendo os dez bilhões de itens.

No caso da pesquisa binária, a indexação pode ser feita apenas uma vez. Inserções posteriores podem ser feitas no lugar certo para manter a ordem.

Tulains Córdova
fonte
2

Embora muitas boas razões para "a pesquisa binária seja melhor" já tenham sido listadas, também podemos dar uma olhada nas vantagens da perspectiva do usuário:

Embora normalmente você possa viver muito bem com o pequeno tempo de espera dividido entre as ações de inserção de dados ao fazer uma inserção classificada, você deseja que a "pesquisa" seja o mais rápido possível. Do ponto de vista do usuário, a inserção classificada combinada com uma pesquisa binária oferece a melhor experiência possível ao usuário.

tofro
fonte