Niektóre proste techniki znacznie przyspieszające algorytmy są stosowane tak powszechnie, jak drożdże przy pieczeniu ciasteczek. W tym artykule poznasz najbardziej kultową z nich – wyszukiwanie binarne (ang. binary search).
Dany jest ciąg liczb i zapytań Każde z nich jest postaci: określ czy liczba występuje w ciągu.
Dla każdego z zapytań w czasie przeglądamy cały ciąg w poszukiwaniu Oznacza to, że wykonamy operacji, co zdecydowanie nie jest satysfakcjonujące. Przyspieszmy ten algorytm korzystając z pewnej obserwacji.
Posortujmy rosnąco wartości w jakikolwiek szybki sposób.
Zauważmy, że jeśli to tym bardziej dla każdego
Analogicznie, jeśli to tym bardziej dla każdego
Wykorzystując powyższy fakt, dochodzimy do wniosku, że jeśli to w zależności od tego czy czy wartość na pewno nie będzie występować na pozycjach większych lub mniejszych od
Niech i będą odpowiednio początkiem i końcem przedziału, na którym może wystąpić Jako, że na początku nie mamy żadnych informacji na temat naszego ciągu, to potencjalnie może ono wystąpić wszędzie: Niech będzie środkiem przedziału: (zaokrąglone w dół). Sprawdzimy teraz relację między a : - : -a na pewno nie ma na przedziale ale może wystąpić w Przyjmujemy
Po skończonej liczbie wywołań takiego algorytmu ponieważ z każdym krokiem zmniejszamy długość naszego przedziału. Oznacza to, że jedyne miejsce, w którym potencjalnie może znaleźć się to Wystarczy sprawdzić czy i możemy odpowiedzieć na zapytanie.
Warto zastanowić się, jaka dokładnie jest ta 'skończona liczba wywołań'. Za każdym razem zmniejszamy długość naszego przedziału dwukrotnie. Oznacza to, że po pierwszym wykonaniu algorytmu nasz przedział będzie dwa razy krótszy, po drugim: cztery, po trzecim: osiem, a po -tym: Długość przedziału wyniesie po krokach dla takiego że
Takie nazywamy logarytmem dwójkowym i w informatyce oznaczamy jako Złożoność czasowa odpowiedzi na jedno zapytanie wynosi Ze względu na to, że potęgi dwójki bardzo szybko rosną, logarytm rośnie powoli. Zauważmy, że dla zachodzi Dla komputera jest to tyle, co nic. Mając dane zapytań, koszt czasowy całego programu można oszacować jako gdyż sortowanie ciągu kosztuje Opisaną wyżej technikę nazywamy wyszukiwaniem binarnym.
Znajdź najmniejszą liczbę całkowitą większą lub równą pierwiastkowi
Podobnie jak w powyższym problemie, będziemy zmniejszać przedział możliwości. Na początku znajdźmy górne i dolne ograniczenia. Wiemy, że pierwiastek jest na pewno dodatni: możemy przyjąć Tak samo żadna liczba całkowita nie ma pierwiastka większego od samej siebie: ustawmy
„Strzelamy” w środek przedziału – i sprawdzać, relację z Jeżeli to – szukana wartość będzie większa niż To znaczy, że będzie znajdować się na przedziale W przeciwnym wypadku pozostaje do rozważenia przedział
Tak samo jak ostatnio po ruchach oraz jest to rozwiązanie naszego pierwiatka. W przypadkach takich, jak to zadanie, gdy wyszukujemy wartość, będącą rozwiązaniem danego problemu, mówimy o „wyszukiwaniu binarnym po wyniku”.