Procura binária no PHP

Comments

Uma coisa é certa, a função in_array do PHP é devagar, lerda demais.

Existe uma alternativa para pesquisar se o elemento está na matriz chamada "procura binária", que aliás, tanto faz a linguagem que você usa, as idéias são as mesmas. O conceito é simples, ver se o item está no meio da matriz, se não estiver, cortar ela no meio, ver se está na metade, se não estiver, cortar a metade ao meio, ad infinitum, ou até que dure.

Imagine que você tenha de procurar o nome "Julio Nobrega" na lista telefônica. Ir de item em item e ver se cada um equivale ao termo é loucura. Oras, abra a lista bem no meio e veja o nome, se ele for Julio Nobrega, pronto. Se não for, o nome que está no meio, é maior ou menor que o nosso termo? Se for maior, parta na metade a lista e procure na primeira parte. Eliminamos 50% de onde vamos procurar num piscar de olhos. Repita isso, e o espaço de procura vai diminuindo até só sobrar o termo pesquisado. Muito melhor que um por um.

Lá vai a função:

PHP:
  1. function procura_binaria($elemento, $matriz)
  2. {
  3.     $baixo = 0;
  4.     $alto = sizeof($matriz) - 1;
  5.     while ($baixo <= $alto) {
  6.         $meio = floor(($baixo + $alto) / 2);
  7.         if ($elemento == $matriz[$meio]) {
  8.             return $matriz[$meio];
  9.         } else {
  10.             if ($elemento <$matriz[$meio]) {
  11.                 $alto = $meio - 1;
  12.             } else {
  13.                 $baixo = $meio + 1;
  14.             }
  15.         }
  16.     }
  17.     return false; // Não achou!
  18. }

Usar é moleza:

PHP:
  1. if (!pesquisa_binaria($termo, $matriz)) {
  2.     echo 'Não achou!';
  3. }

  • inerte
    É, heh :) Esqueci de mencionar a ordenação.

    Quanto à matriz, array, vetor, lista, dicionário, tabela, às vezes eu me confundo todo :p você está corretíssimo.

    Em retrospecto, minha escrita pecou nesses erros.. obrigado pelos avisos!
  • a in_array encontra o elemento mesmo se o array não estiver ordenado... se vc precisar ordenar o array antes, não compensa usar a pesquisa binária...

    ah, e sendo chato: o correto é array ou vetor... matriz tem duas dimensões :)
blog comments powered by Disqus

Português flagItaliano flagCoreano flagChinês (simplificado) flagEnglish flagAlemâo flagFrancês flagEspanhol flag
Japonês flagÁrabe flagRusso flagHolandês flagBúlgaro flagTcheco flagCroata flagDinamarquês flag
Finlandês flagHindu flagPolonês flagRomeno flagSueco flagGrego flagNorueguês flag 
By N2H
96 DOLETAS de desconto na hospedagem Dreamhost!
Use o "PROMO CODE" INERCIA. LAMP com 20GB de espaço e 1TB de transferência.

Artigos relacionados

  • No Related Posts

Categories