Das Durchsuchen eines Arrays von Elementen mit der binären Suche erfordert im schlimmsten Fall Iterationen, da wir bei jedem Schritt die Hälfte unseres Suchraums abschneiden. Wenn wir stattdessen 'ternäre Suche' verwenden würden, würden wir bei jeder Iteration zwei Drittel unseres Suchraums , daher sollte der schlimmste Fall Iterationen ...log 2 N log 3 N < log 2 N
Es scheint, dass die ternäre Suche schneller ist. Warum verwenden wir also die binäre Suche?
algorithms
algorithm-analysis
runtime-analysis
search-algorithms
binary-search
Der mittlere Platz
quelle
quelle
Antworten:
Wenn Sie die binäre Suche anwenden, haben Sie viele Vergleiche. Wenn Sie die ternäre Suche anwenden, haben Sie viele Vergleiche, da Sie in jedem Schritt 2 Vergleiche durchführen müssen, um den Suchraum in drei Teile zu unterteilen. Wenn Sie nun , können Sie feststellen, dass: Da wir wissen, dass , erhalten wir tatsächlich mehr Vergleiche mit der ternären Suche.2 ≤ log 3 ( n ) + O ( 1 ) 2 ≤ log 3 ( n ) + O ( 1 ) =
Übrigens: Eine fache Suche kann sehr sinnvoll sein, wenn Vergleiche sehr kostspielig sind und parallelisiert werden können, da dann parallele Computer angewendet werden können.n
Beachten Sie, dass das Argument leicht auf die fache Suche verallgemeinert werden kann. Sie müssen nur zeigen, dass die Funktion für ganzzahlige Werte von streng monoton ansteigt .n f(k)=(k−1)⋅log(2)log(k) k
quelle
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!
quelle
Bitte beachten Sie, dass das Argument log (N) vs 2 log (N) Vergleiche auf einer naiven Interpretation des Algorithmus basiert. Wenn ich mich tatsächlich hinsetzen und dies in x86-Assembly schreiben würde, würden die Ergebnisse invertiert. Das Problem ist die Verwendung von Ganzzahlen für Testfälle in Kombination mit einem nicht ausreichend intelligenten Compiler, der die redundanten Vergleiche nicht entfernen kann. Versuchen Sie es erneut mit Zeichenfolgen und einer geeigneten Zeichenfolgenvergleichsfunktion, und codieren Sie sie, um die Vergleichsfunktion einmal pro Schleife aufzurufen. Sie werden feststellen, dass die ternäre Suche wieder schneller ist.
quelle