Binárne vyhľadávanie

z Wikipédie, slobodnej encyklopédie
Prejsť na: navigácia, hľadanie

Binárne vyhľadávanie je vyhľadávací algormitmus na nájdenie zadanej hodnoty v usporiadanom zozname pomocou skracovania zoznamu o polovicu v každom kroku. Binárne vyhľadávanie nájde medián, urobí porovnanie a na základe tohoto sa rozhodne o pokračovaní v hornej alebo dolnej časti zoznamu a rekurzívne sa pokračuje od začiatku.

Binárne vyhľadávanie je algoritmus s logaritmickou zložitosťou O(log n). Presnejšie, iterácií je potrebných na získanie výsledku. Je značne rýchlejšie ako lineárne vyhľadávanie, ktoré má zložitosť O(n). Dá sa vyjadriť rekurzívne aj iteratívne, avšak vo veľa programovacích jazykoch je rekurzívny zápis oveľa elegantnejší.

Binárne vyhľadávanie je príkladom algoritmu typu rozdeľ a panuj.

Implementácie[upraviť | upraviť zdroj]

Rekurzívna implementácia binárneho vyhľadávania v jazyku Python:

 def binarySearch(zoznam, hodnota, vlavo, vpravo):
     if vpravo < vlavo:
         return False
     stred = vlavo + ((vpravo - vlavo) / 2)
     if zoznam[stred] == hodnota:
         return True
     if hodnota < zoznam[stred]:
         binarySearch(zoznam, hodnota, vlavo, stred - 1)
     else:
         binarySearch(zoznam, hodnota, stred + 1, vpravo)

Vďaka tomu, že rekurzívne volania sú na konci funkcie (koncová rekurzia), je možné túto implementáciu prepísať len pomocou cyklu:

 def binarySearch(zoznam, hodnota, vlavo, vpravo):
     while vlavo <= vpravo:
         stred = vlavo + ((vpravo - vlavo) / 2)
         if zoznam[stred] == hodnota:
             return True
         if hodnota < zoznam[stred]:
             vpravo = stred - 1
         else:
             vlavo = stred + 1
     return False

Implementačné komplikácie[upraviť | upraviť zdroj]

Keď Jon Bentley priradil binárne vyhľadávanie ako problém pre kurz profesionálnych programátorov, zistil, že 90% z nich nedokáže poskytnúť správne riešenie. ďalšia štúdia publikovaná v roku 1988 ukazuje, že správny kód pre binárne vyhľadávanie sa dá nájsť len v 5 z 20 učebniciach. Ďalej, Bentley-ho vlastná implementácia binárneho vyľadávania, publikovaná v roku 1986 v knihe Programming Pearls, obsahovala chybu typu overflow (v skutočnosti prekročenie veľkosti premennej typu integer), ktorá ostala neodhalená viac ako 20 rokov.[1]

V oficiálnej knižnici v jazyku Java sa vyskytovala rovnaká chyba po dobu viac než 9 rokov.[2]

  • Ukážkový kód algoritmu, ktorý bol na tejto stránke, pred úpravou túto chybu obsahoval tiež.

Referencie[upraviť | upraviť zdroj]

  1. https://research.googleblog.com/2006/06/extra-extra-read-all-about-it-nearly.html
  2. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=5045582