Binární vyhledávání

Binární vyhledávání (hledané číslo: 6)
Binární vyhledávání (hledané číslo: 6)

Binární vyhledávání (půlení intervalu) je vyhledávací technika, která zjišťuje pozici zadaného prvku v seřazeném poli. Na rozdíl od sekvenčního vyhledávání, které vyžaduje až O(n) operací, binární vyhledávání pracuje s asymptotickou složitostí O(\log_{2}{n}).

Princip

Mějme sestupně seřazené pole a hledejme v něm prvek h. Binární vyhledávání v každém svém kroku zvolí prostřední prvek pole (p) a porovná jej s prvkem h. Pokud jsou tyto prvky totožné, tak vrátí index prvku p. Pokud má hledaný prvek vyšší hodnotu než p, tak je žřejmé, že h se musí nacházet v levé části pole. V opačném případě (p > h) se hledaný prvek musí nacházet v pravé části pole. Binární vyhledávání proto zavolá sebe sama na příslušnou perspektivní polovinu pole.

Protože dochází v každém kroku k půlení prohledávaného intervalu (a druhá polovina se nezpracovává), tak musí dojít k nalezení (nebo vyvrácení přítomnosti) hledaného prvku nejpozději v \log_{2}{n} krocích.

Kód

    /**
     * Binarni vyhledavani
     * @param array prohledavane pole (setridene od nejvyssiho)
     * @param leftIndex prvni index, na ktery smime sahnout
     * @param rightIndex posledni index, na ktery smime sahnout
     * @param value hodnota k nalezeni
     * @return index hodnoty, -1 v pripade nenalezeni
     */
    public static int binarySearch(int[]  array, int leftIndex, int rightIndex, int value){
        if(leftIndex == rightIndex && array[leftIndex] != value) return -1;
    
        int middleIndex = leftIndex + (rightIndex - leftIndex)/2;
        if(array[middleIndex] == value) return middleIndex;
        else if(array[middleIndex] > value) 
            return binarySearch(array, middleIndex + 1, rightIndex, value);
        else return binarySearch(array, leftIndex, Math.max(leftIndex, middleIndex - 1), value);
}    
{ zpětná vazba }
Delicious Delicious
Sdílet
Hodnocení (2): 3,5

Přečtěte si také

Diskuse





Pavel Mička13.11.2011
> Flavius

Díky.
Flavius11.11.2011
Tenhle kód má v sobě bug, který se nalézal v implementaci binarySearch v Javě až do verze 5.0 (v 6.0 je opraven) a to ten, že při počítání middleIndexu může součet leftIndex + rightIndex přetéct do záporných hodnot, tam se akorát vydělit dvojkou a zůstat záporný. Proto počítání middleIndexu má být

int middleIndex = (rightIndex - leftIndex) / 2 + leftIndex;
0xenon17.5.2010
mas pravdu, ja si zase nevsiml toho obrazku :)
Pavel Mička16.5.2010
Díky za připomínku...kód byl dobře, ale zapomněl jsem dát do dokumentace, že pole je setříděné od nejvyššího (jako na obrázku)...Tvá verze by byla pro opačné setřídění.
0xenon16.5.2010
jsou tam prohozene radky 15,16..