DCTLib ist richtig, aber vergessen Sie die Mathematik für eine Sekunde.
Nach Ihrer Logik sollte n -ary dann am schnellsten sein. Aber wenn Sie darüber nachdenken, entspricht n -ary genau einer regulären Iterationssuche (nur 1-mal-1-Iteration durch die Liste, jedoch in umgekehrter Reihenfolge). Zuerst wählen Sie das letzte (oder vorletzte) Element in der Liste aus und vergleichen diesen Wert mit Ihrem Vergleichswert. Dann entfernen Sie dieses Element aus Ihrer Liste und wählen dann das letzte Element in der neuen Liste aus, bei dem es sich nur um den vorletzten Wert im Array handelt. Jedes Mal eliminieren Sie immer nur 1 Wert, bis Sie Ihren Wert gefunden haben.
Stattdessen sollten Sie sich das so überlegen - wie entferne ich die meisten Werte aus der Liste bei jeder Iteration? Bei einer binären Suche eliminieren Sie immer die Hälfte der Liste. Bei einer ternären Suche besteht die Möglichkeit, dass Sie 2/3 der Liste entfernen (33,33% Wahrscheinlichkeit), bei einer noch größeren Wahrscheinlichkeit (66,66%), dass Sie nur 1/3 der Liste entfernen. Um O (n) zu berechnen, müssen Sie sich das Worst-Case-Szenario ansehen, das 1/3, weniger als 1/2 ist. Je näher man sich n nähert, desto schlimmer wird es.
Durch die binäre Suche wird nicht nur das Worst-Case-Szenario verbessert, sondern auch Ihre durchschnittliche Zeit. Wenn wir den erwarteten Wert betrachten (welchen Teil der Liste können wir durchschnittlich entfernen), verwenden wir diese Formel:
(P_lower) x (Anteil, den wir entfernen können, wenn er niedriger ist) + (P_higher) x (Anteil, den wir entfernen können, wenn er höher ist) = E
Bei der binären Suche ist dies .5x.5 + .5x.5 = .5 (wir entfernen immer die Hälfte der Liste). Bei ternären Suchvorgängen beträgt dieser Wert .666x.333 + .333x.666 = 0,44, oder bei jedem Schritt werden wahrscheinlich nur 44% der Liste entfernt, was sie im Durchschnitt weniger effizient als die binäre Suche macht. Dieser Wert erreicht die Spitze bei 1/2 (die Hälfte der Liste) und nimmt ab, je näher Sie an n (umgekehrte Iteration) und 0 (reguläre Iteration) gelangen.
Ok, also habe ich gelogen ... es ist ein bisschen Mathe dabei, aber ich hoffe, das hilft!