Kann dieser Algorithmus immer noch als binärer Suchalgorithmus betrachtet werden?


13

Bei der zweiten Code-Kata (bei der Sie aufgefordert werden, fünf Mal einen binären Suchalgorithmus zu implementieren, jedes Mal mit einer anderen Methode) habe ich eine etwas andere Lösung gefunden, die wie folgt funktioniert:

Wenn ich ein sortiertes Array mit einer Länge von 100 habe und sehe, dass sein Startfeld die Nummer 200 und sein Endfeld die Nummer 400 enthält, würde ich als Mathematikstudent wahrscheinlich anfangen, Feld 35 zu durchsuchen, wenn ich das suche 270 und nicht das Feld 50 wie bei einem normalen binären Suchalgorithmus.

Wenn die Nummer in Feld 35 des Arrays 270 ist, ist 35 der Index, nach dem ich gesucht habe.

Wenn das nicht der Fall ist, kann ich die Zahl vergleichen (sagen wir 280) und die Operation wiederholen, indem ich den unteren Teil des Arrays nehme (also habe ich 35 Felder, wobei das Startfeld 200 enthält und das Endfeld 280 enthält), wenn die Die Zahl, die ich gefunden habe, ist größer als das, wonach ich gesucht habe, oder der obere Teil des Arrays (sagen wir, ich habe 260: jetzt habe ich 65 Indizes, der erste 260 und der letzte 400. Orientativ würde ich aufwärts gehen Index 4 dieses Sub-Arrays (Index 39 des gesamten Arrays), wenn die Zahl, die ich erhalten habe, kleiner ist als die Zahl, nach der ich suche.

Die Frage ist: Kann dieser Algorithmus als binärer Suchalgorithmus angesehen werden? Wenn nicht, hat es einen eigenen Namen?


2
Ob es sich um eine binäre Suche handelt oder nicht, scheint eine reine Ansichtssache zu sein. Im Grunde ist die einzige Antwort, die Sie geben können, entweder "Ja, es ist nah genug an der binären Suche, um sie als binäre Suche zu bezeichnen" oder "Nein, ist es nicht". Argument folgt.
David Richerby

Antworten:


22

Ich würde das keine binäre Suche nennen.

Es ähnelt eindeutig der binären Suche und ist natürlich eine Verfeinerung der binären Suche. Die Komplexitätsmerkmale des Algorithmus unterscheiden sich jedoch erheblich. Die Interpolationssuche hat eine Laufzeit von O (log (log (n)) erwartet, vorausgesetzt, die Daten sind gleichmäßig verteilt. Dies wird jedoch durch die Laufzeit von O (n) im ungünstigsten Fall bezahlt.

Ich sage lieber "Die Laufzeit der Binärsuche im ungünstigsten Fall ist O (log (n))" als "Abhängig von der Auswahl der Begrenzungselemente beträgt die Laufzeit der Binärsuche im ungünstigsten Fall O (log (n))". Dies bedeutet, dass ich die Interpolationssuche nicht als binären Suchalgorithmus klassifizieren kann.


Vermutlich, wenn Sie die Interpolationssuche abbrechen, wenn sie schlecht läuft, können Sie O (log n) worst case und O (log log n) für ausreichend lineare Daten beibehalten. Ich vermute, dass so etwas wie "Wenn ich nach n Anmeldeversuchen das Ziel nicht gefunden habe, dann wechsle ich zur binären Suche" funktioniert, aber ich bin zu faul, um es zu beweisen. Es wird natürlich eine Klasse von Killereingaben geben, bei denen dies im Grunde doppelt so lange dauert wie eine binäre Suche.
Steve Jessop

Diese Killer-Input-Idee ist interessant. Was wäre, wenn wir nicht zulassen würden, dass Killereingaben die Suche negativ beeinflussen (z. B. durch Teilen am Ende eines Arrays), sondern den "aufteilbaren Bereich" auf das 2. Drittel des Arrays oder ähnliches beschränken / trimmen. Das hätte den schlechtesten Fall log3 (n), aber immer noch den besten Fall log (log).
Andrew Gallasch

@SteveJessop Denken Sie daran, dass asymthotische Komplexität nicht das vollständige Bild ist. O (log n) ist sehr schnell. Außerdem macht die binäre Suche in jeder Schleife sehr wenig Arbeit. Das Problem bei der Interpolationssuche besteht also bereits darin, dass Sie sehr lange Eingaben benötigen, um die Tatsache auszugleichen, dass Sie in jeder Schleife mehr arbeiten. Ihr Vorschlag fügt dem mehr Arbeit hinzu. Wenn ich O (n) für Daten, die nicht einheitlich waren, nicht akzeptieren konnte, ist meiner Meinung nach die beste Lösung eine reine binäre Suche anstelle eines hybriden Ansatzes.
Taemyr

@SteveJessop: Algorithmen müssen nicht gewechselt werden. Dies kann parallel erfolgen. Bei einem gegebenen Bereich R können Sie den Punkt P1 als den üblichen Mittelpunkt für die binäre Suche und P2 durch Interpolation bestimmen. Sie haben jetzt drei Unterbereiche, von denen keiner größer als die Hälfte des ursprünglichen Bereichs sein kann. Überprüfen Sie den Zielwert sowohl mit P1 als auch mit P2, und Sie wissen, in welchem ​​der drei Unterbereiche Sie zurückkehren müssen.
MSalters,

16

Ö(LogLogn)


Cool. Jetzt ist die Frage, ob ich es für die Code-Kata verwenden kann, aber es ist mein Problem, lol. Ich finde es komplizierter als die binäre Suche, warum also nicht.
user6245072

Ich habe dies einmal entdeckt, als ich vor ein paar Jahren Code geschrieben habe, um eine Protokolldatei zu indizieren. Ich entdeckte auch, dass für meine Daten das Wechseln der Schritte zwischen Interpolation und Binärschnitt besser war als jede Option für sich. Ich bin nicht sicher, ob das einen Namen hat oder ein bekannter Effekt ist.
Neil Slater

@ NeilSlater abgesicherte Interpolationssuche vielleicht?
Steve Cox

@SteveCox: Ich habe gerade nach diesem Begriff gesucht und nichts gefunden. Beschlossen, dies als neue Frage zu stellen: cs.stackexchange.com/questions/59750/…
Neil Slater

-1

Ich denke, die richtige Terminologie wäre dychotomisch überlegte Suche.

Sie suchen in einem flachen Array mit anschließendem überlegten Suchen basierend auf der angenommenen flachen Verteilung der darin enthaltenen Zahlen.

Dies entspricht der Art und Weise, wie eine Person ein Wort in einem Wörterbuch suchen würde. Es kann jedoch sehr ineffizient sein, wenn die Verteilung der Daten unregelmäßig ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.