Warum wird die binäre Suche, die sortierte Daten benötigt, als besser angesehen als die lineare Suche?

20

Ich habe immer gehört, dass die lineare Suche ein naiver Ansatz ist und die binäre Suche aufgrund der besseren asymptotischen Komplexität leistungsfähiger ist als sie. Aber ich habe nie verstanden, warum es besser ist als eine lineare Suche, wenn vor einer binären Suche eine Sortierung erforderlich ist.

Die lineare Suche ist O(n)und die binäre Suche ist O(log n). Das scheint die Grundlage dafür zu sein, dass die binäre Suche besser ist. Die binäre Suche erfordert jedoch eine Sortierung O(n log n)nach den besten Algorithmen. Die binäre Suche sollte also eigentlich nicht schneller sein, da sie eine Sortierung erfordert.

Ich lese CLRS, in dem der Autor impliziert, dass es bei der Einfügesortierung besser ist, die Binärsuche zu verwenden, um die Stelle zu finden, an der das Element eingefügt werden muss, anstatt den naiven linearen Suchansatz zu verwenden. In diesem Fall scheint dies gerechtfertigt zu sein, da bei jeder Schleifeniteration eine sortierte Liste vorhanden ist, über die die binäre Suche angewendet werden kann. Aber im allgemeinen Fall, in dem es keine Garantie für den zu durchsuchenden Datensatz gibt, ist die binäre Suche aufgrund von Sortieranforderungen nicht tatsächlich schlechter als die lineare Suche?

Gibt es irgendwelche praktischen Überlegungen, die ich übersehen habe und die die binäre Suche besser machen als die lineare Suche? Oder wird die binäre Suche als besser angesehen als die lineare Suche, ohne die für die Sortierung erforderliche Rechenzeit zu berücksichtigen?

Aseem Bansal
quelle
6
Wie bei so vielen anderen Dingen kommt es darauf an: "Es kommt darauf an ...;)"
Jeff B
Wenn die Liste bereits sortiert ist, denken Sie, dass die lineare Suche immer noch besser ist? Dies ist hier möglicherweise zu berücksichtigen.
JB King
3
Wenn Sie den Titel ändern möchten , sollten Sie den Teil über sortierte Daten nicht entfernen, da das Entfernen eine völlig andere Frage darstellt.
Aseem Bansal

Antworten:

53

Gibt es irgendwelche praktischen Überlegungen, die ich übersehen habe, um die binäre Suche besser als die lineare Suche zu machen?

Ja - Sie müssen die O (n log n) -Sortierung nur einmal durchführen und können dann die O (log n) -Binärsuche so oft durchführen, wie Sie möchten, während die lineare Suche jedes Mal O (n) ist.

Dies ist natürlich nur dann von Vorteil, wenn Sie tatsächlich mehrere Suchvorgänge mit denselben Daten durchführen. Aber "einmal schreiben, oft lesen" -Szenarien sind weit verbreitet.

Michael Borgwardt
quelle
Wenn Sie etwas nur einmal tun, hat es wenig Sinn, es zu optimieren.
14

Die Grundannahme ist, dass Sie keine einzige Suche durchführen.

Wenn Sie also dieselben Daten mehrmals durchsuchen müssen, müssen Sie nur einmal sortieren und können von der binären Suche profitieren.

Wenn Sie häufig suchen und Daten ändern, empfiehlt es sich, eine sortierte Liste zu verwenden, in der neue Einträge in der Liste sortiert werden.

Daher ist die binäre Suche besser, wenn Sie dieselbe Liste mehrmals durchsuchen, ohne erneut suchen zu müssen.

Wenn Sie jedes Mal sortieren müssen, bevor Sie suchen, gibt es keinen Vorteil.

Bitte beachten Sie, dass es Sortieralgorithmen gibt, die sehr schnell sind, wenn die Liste bereits sortiert (oder fast sortiert) ist. Die meisten Leistungsbestimmungen erwarten eine unsortierte Liste.

Uwe Plonus
quelle
2
Wenn Sie häufig suchen und häufig einfügen, sehen Sie sich möglicherweise kompliziertere Datenstrukturen an (z. B. binäre Bäume).
MarkJ
@MarkJ Die grundlegende Frage des ursprünglichen Plakats war die Suche in einer Liste. Sonst stimme ich dir vollkommen zu.
Uwe Plonus
7

Denn sobald Sie eine sortierte Liste haben, müssen Sie sie nicht jedes Mal neu sortieren. Wenn Sie also mehr als O (log n) Suchanfragen im Voraus sortieren, erhalten Sie einen Gewinn ( O(n log n + k log n)vsO(k*n)

Ratschenfreak
quelle
5

Stellen Sie sich zwei Telefonbücher vor.

Ein Telefonbuch enthält die Namen in alphabetischer Reihenfolge. Um den gewünschten Eintrag zu finden, öffnen Sie ihn in der Mitte, überprüfen ihn und bewegen sich dann vorwärts oder rückwärts, je nachdem, ob Sie über- oder unterschritten haben.

Das andere Telefonbuch enthält die Namen in zufälliger Reihenfolge. Um den gewünschten Eintrag zu finden, beginnen Sie am Anfang und fahren fort, bis Sie das Gewünschte gefunden haben.

Funktioniert das zweite Buch in einer Stadt mit angemessener Größe?

Gort den Roboter
quelle
3

Ich denke, dass der Wert der binären Suche über die lineare Suche kontextabhängig ist. Wenn Sie mit einem enormen ungeordneten Datensatz beginnen und nur eine kleine Anzahl von Elementen davon zupfen möchten, ist das Sortieren und Durchführen einer binären Suche langsam. Wenn Sie jedoch während der gesamten Lebensdauer Ihrer Anwendung eine geordnete Liste führen und regelmäßig darauf zugreifen, ist die binäre Suche ein weitaus besserer Weg.

Amischer Programmierer
quelle
3

Wie viele andere geantwortet haben, ist die binäre Suche in der Tat vorzuziehen, da der Sortierschritt nur einmal durchgeführt werden kann und die eigentliche Suche dann so oft durchgeführt werden kann, wie Sie möchten. Für bestimmte Werte von n (dh bestimmte Eingabegrößen) ist die binäre Suche jedoch immer leistungsfähiger als die lineare Suche (selbst für einen einzelnen Lauf).

Der "Wendepunkt" wird durch Lösen der asymptotischen Komplexitätsgleichung berechnet:

n log n + log n = n

Wie Sie auf Wolfram Alpha sehen können, gibt es einen numerischen Wert für n , der sicherstellt, dass die binäre Suche und Sortierung immer schneller ist als die lineare Suche allein. Natürlich hängt der tatsächliche Wert von n , der in Ihrem Fall funktioniert, von vielen Faktoren ab, die möglicherweise schwer abzuschätzen sind.

Nach diesem interessanten Artikel von Mark Probst, der einige ausführliche Performance-Messungen auf aktuellen Prozessoren enthält:

Wenn Sie ein sortiertes Array von Ganzzahlen durchsuchen müssen und die Leistung wirklich sehr wichtig ist, verwenden Sie die lineare Suche, wenn Ihr Array eine Größe von weniger als 64 Elementen hat, und die binäre Suche, wenn es darüber liegt.

LorenzCK
quelle
2

Mit den Worten des Laien:

Wenn Sie eine ungeordnete Liste mit zehn Milliarden Artikeln haben und der Artikel, nach dem Sie suchen, der letzte ist, werden Sie am Ende die zehn Milliarden Artikel lesen.

Bei der binären Suche kann die Indizierung nur einmal durchgeführt werden. Spätere Einfügungen können an der richtigen Stelle vorgenommen werden, um die Reihenfolge aufrechtzuerhalten.

Tulains Córdova
quelle
2

Zwar wurden bereits viele gute Gründe für "Binäre Suche ist besser" aufgeführt, wir können jedoch auch einen Blick auf die Vorteile aus Benutzersicht werfen:

Während Sie normalerweise sehr gut mit der geringen Wartezeit leben können, die zwischen Dateneingabeaktionen aufgeteilt ist, wenn Sie eine sortierte Einfügung durchführen, möchten Sie, dass die "Suche" so schnell wie möglich erfolgt. Aus Sicht des Benutzers bietet sortiertes Einfügen in Kombination mit einer binären Suche die bestmögliche Benutzererfahrung.

Tofro
quelle