tak i nie. Tak, są wyszukiwania, które są średnio szybsze niż wyszukiwanie bisekcji. Ale uważam, że wciąż są one O (lg N), tylko z niższą stałą.
Chcesz zminimalizować czas potrzebny na znalezienie elementu. Zasadniczo pożądane jest stosowanie mniejszej liczby kroków, a jednym ze sposobów podejścia jest maksymalizacja oczekiwanej liczby elementów, które zostaną wyeliminowane na każdym etapie. Przy pomocy bisekcji eliminuje się dokładnie połowę elementów. Możesz zrobić to lepiej, jeśli wiesz coś o rozkładzie pierwiastków. Ale algorytm wybierania elementu partycji jest zwykle bardziej skomplikowany niż wybór punktu środkowego, a ta dodatkowa złożoność może przytłoczyć wszelkie oszczędności czasu, które można uzyskać dzięki mniejszej liczbie kroków.
Naprawdę, w takim przypadku lepiej jest zaatakować efekty drugiego rzędu, takie jak lokalizacja pamięci podręcznej, niż algorytm wyszukiwania. Na przykład, podczas wykonywania wielokrotnego wyszukiwania binarnego, te same kilka elementów (pierwszy, drugi i trzeci kwartyl) są używane BARDZO często, więc umieszczenie ich w pojedynczej linii pamięci podręcznej może znacznie przewyższyć losowy dostęp do listy.
Dzielenie każdego poziomu na powiedzmy 4 lub 8 równych sekcji (zamiast 2) i przeszukiwanie liniowe może być szybsze niż wyszukiwanie bisekcji, ponieważ wyszukiwanie liniowe nie wymaga obliczenia partycji, a także ma mniej zależności danych, które mogą powodować stragany z pamięci podręcznej.
Ale wszystkie z nich nadal należą do O (lg N).
Jeśli masz komputer kwantowy, możesz spróbować http://pl.wikipedia.org/wiki/Grover%27s_algorithm :) –
@David: Lista jest posortowana, więc algorytm Grover'a jest gorszy niż wyszukiwanie bisekcji. O (sqrt N)> O (lg N) –
maszyna stanu działała dla mnie na dużych danych, ale złożoność/pamięć dla stanów budynku jest znacznie większa niż sortowanie. – technosaurus