Wyszukiwanie binarne
| Wyszukiwanie binarne | |
| Rodzaj | Podstawowy algorytm wyszukiwania |
| Struktura danych | Tablica |
| Złożoność | |
| Czasowa | O(log2n) |
| Pamięciowa | O(1) |
Wyszukiwanie binarne jest algorytmem opierającym się na metodzie dziel i zwyciężaj, który w czasie logarytmicznym stwierdza, czy szukany element znajduje się w uporządkowanej tablicy i jeśli się znajduje, podaje jego indeks. Np. jeśli tablica zawiera milion elementów, wyszukiwanie binarne musi sprawdzić maksymalnie 20 elementów (
) w celu znalezienia żądanej wartości. Dla porównania wyszukiwanie liniowe wymaga w najgorszym przypadku przejrzenia wszystkich elementów tablicy.
Spis treści |
Zasada działania algorytmu [edytuj]
Uporządkowana tablica jest dzielona na coraz mniejsze przedziały do momentu, gdy szukany element zostanie znaleziony, bądź przedział osiągnie długość zero, co oznacza brak elementu.
W pojedynczym kroku rozważa się jeden przedział charakteryzowany dwoma indeksami: początkowym
i końcowym
. Algorytm rozpoczyna wyszukiwanie od całej tablicy.
Następnie wyznaczany jest środek tego przedziału
. Wówczas testowane jest, czy element zapisany pod indeksem
jest tym poszukiwanym — jeśli tak, to algorytm w tym miejscu kończy działanie.
W przeciwnym razie przedział jest zawężany - dzięki uporządkowaniu danych wiadomo, że albo poszukiwany element może znajdować się gdzieś przed indeksem
albo za nim. Innymi słowy wybór ogranicza się do przedziału
, gdy poszukiwany element jest mniejszy od zapisanego pod indeksem
, albo
w przeciwnym razie.
Algorytm kończy się niepowodzeniem, jeśli przedział będzie pusty, tzn.
(lewy koniec przedziału "znajdzie się" za prawym końcem).
Pseudokod [edytuj]
A := [...] { n-elementowa tablica uporządkowana } lewo := 0 { indeks początku przedziału } prawo := n-1 { indeks końca przedziału - początkowo cała tablica A } y := poszukiwana wartość indeks := pusty while lewo <= prawo do begin środek := (lewo + prawo)/2; { dzielenie całkowitoliczbowe } x := A[środek]; if x = y then begin { znaleziono poszukiwany element } indeks := środek; break; end; { w przeciwnym razie przedział jest zawężany, } { a poszukiwanie kontynuowane } if x < y then lewo := środek + 1; else. prawo := środek - 1; end;
Wyszukiwanie interpolacyjne [edytuj]
Wariant wyszukiwania binarnego, w którym punkt podziału (indeks
) jest wyznaczany metodą interpolacji liniowej.
Jeśli wartości kluczy na krańcach przedziału wynoszą
i
i poszukiwana wartość
, wówczas indeks można wyznaczyć jako
, gdzie parametr wynika z wartości kluczy:
.
Algorytm charakteryzuje o wiele lepsza średnia złożoność obliczeniowa niż zwykłego wyszukiwania binarnego, wynosi bowiem
, a nie
. Złożoność w przypadku pesymistycznym jest jednak liniowa. Jak podaje Knuth, testy empiryczne wykazują, że podejście to dobrze sprawdza się dla bardzo dużych rozmiarów tablic, dla niewielkich nie widać wyraźnej przewagi ze względu na bardziej złożone wyliczanie indeksu
.
Pomysłodawcą metody był W.W. Peterson; została ona opracowana ok. 1957 roku.
Zobacz też [edytuj]
Bibliografia [edytuj]
- Donald Knuth, Sztuka programowania. Tom III: Sortowanie i wyszukiwanie, WNT 2002