DCTLib ma rację, ale na chwilę zapomnij o matematyce.
Według twojej logiki, n -ary powinno być najszybsze. Ale jeśli się nad tym zastanowić, n -ary jest dokładnie równe regularnemu wyszukiwaniu iteracyjnemu (tylko iteracja po liście 1 na 1, ale w odwrotnej kolejności). Najpierw wybierz ostatni (lub obok ostatniego) element z listy i porównaj tę wartość z wartością porównania. Następnie usuwasz ten element z listy, a następnie wybierasz ostatni element z nowej listy, który jest tuż przed ostatnią wartością w tablicy. Za każdym razem eliminujesz tylko 1 wartość na raz, dopóki nie znajdziesz swojej wartości.
Zamiast tego powinieneś pomyśleć o tym w ten sposób - jak mogę wyeliminować najwięcej wartości z listy przy każdej iteracji? W wyszukiwaniu binarnym zawsze eliminujesz połowę listy. W trójstronnym wyszukiwaniu istnieje możliwość (faktycznie 33,33% szansy), że możesz wyeliminować 2/3 listy, ale istnieje jeszcze większa szansa (66,66%), że wyeliminujesz tylko 1/3 listy. aby obliczyć O (n), musisz spojrzeć na najgorszy scenariusz, który wynosi 1/3, mniej niż 1/2. W miarę zbliżania się do n staje się jeszcze gorzej.
Wyszukiwanie binarne poprawi nie tylko najgorszy scenariusz, ale także poprawi się średni czas. Patrząc na oczekiwaną wartość (jaką część listy możemy usunąć średnio), używamy tej formuły:
(P_lower) x (część, którą możemy usunąć, jeśli jest niższa) + (P_higher) x (część, którą możemy usunąć, jeśli jest wyższa) = E
W przypadku wyszukiwania binarnego jest to .5x.5 + .5x.5 = .5 (zawsze usuwamy połowę listy). W przypadku wyszukiwań trójskładnikowych wartość ta wynosi .666x.333 + .333x.666 = 0,44, lub na każdym etapie prawdopodobnie usuniemy tylko 44% listy, co czyni ją mniej wydajną niż wyszukiwanie binarne. Wartość ta osiąga wartość szczytową na 1/2 (połowa listy) i zmniejsza się, im bardziej zbliżasz się do n (iteracja wsteczna) i 0 (iteracja zwykła).
Ok, więc skłamałem ... w grę wchodzi trochę matematyki, ale mam nadzieję, że to pomoże!