Wie binäre Suche tun

Es ist möglich, größerer Vorteil der geordneten Liste zu nehmen, wenn wir mit unseren Vergleichen klug sind. Bei der sequenziellen Suche, wenn wir gegen den ersten Punkt zu vergleichen, gibt es höchstens \ (n-1 \) mehr Einzelteile, wenn das erste Element nicht zu durchschauen ist, was wir suchen. Anstatt die Liste in der Reihenfolge der Suche, wird eine binäre Suche starten, indem Sie den mittleren Punkt zu untersuchen. Wenn das Element der ist für uns suchen, sind wir fertig. Wenn es nicht das richtige Element ist, können wir die geordnete Natur der Liste verwenden, die Hälfte der verbleibenden Elemente zu beseitigen. Wenn das Element wir suchen den mittleren Punkt größer ist als, wissen wir, dass die gesamte untere Hälfte der Liste sowie die mittlere Element kann von der weiteren Betrachtung ausgeschlossen werden. Das Element, wenn es in der Liste ist, muss in der oberen Hälfte sein.







Wir können dann wiederholen Sie den Vorgang mit der oberen Hälfte. Beginnen Sie an der mittleren Position und vergleichen sie gegen das, was wir suchen. Auch hier entweder wir es finden oder die Liste in zwei Hälften geteilt, damit ein weiterer großer Teil unserer möglichen Suchraum zu beseitigen. Abbildung 3 zeigt, wie dieser Algorithmus schnell den Wert 54. Die komplette Funktion in CodeLens 3 dargestellt finden.

Abbildung 3: Binäre Suche einer geordneten Liste von ganzen Zahlen

Binäre Suche einer geordneten Liste (search3)

Bevor wir auf die Analyse weitergehen, sollten wir beachten Sie, dass dieser Algorithmus ein gutes Beispiel für eine Teile und Herrsche-Strategie. Teile und herrsche bedeutet, dass wir das Problem in kleinere Stücke aufzuteilen, lösen die kleineren Stücke in irgendeiner Weise, und dann wieder zusammenzusetzen, das ganze Problem das Ergebnis zu erhalten. Wenn wir eine binäre Suche nach einer Liste nachschauen, ob wir zuerst das mittlere Element. Wenn das Element wir suchen kleiner als der mittlere Punkt können wir einfach eine binäre Suche der linken Hälfte der ursprünglichen Liste auszuführen. Ebenso, wenn das Element größer ist, können wir eine binäre Suche der rechten Hälfte durch. So oder so ist dies eine rekursive Aufruf an die binäre Suchfunktion eine kleinere Liste übergeben. CodeLens 4 zeigt diese rekursive Version.

A Binary Search - rekursive Version (Suche 4)

5.4.1. Analyse von binären Search¶







Um den binären Suchalgorithmus zu analysieren, müssen wir daran erinnern, dass jeder Vergleich eliminiert etwa die Hälfte der verbleibenden Elemente aus der Betrachtung. Was ist die maximale Anzahl von Vergleichen wird dieser Algorithmus erfordert die gesamte Liste zu überprüfen? Wenn wir mit n Elementen, etwa \ (\ frac \) Einzelteile werden links nach dem ersten Vergleich starten. Nach dem zweiten Vergleich wird es etwa \ (\ frac \) sein. Dann \ (\ frac \). \ (\ Frac \). und so weiter. Wie oft können wir teilen die Liste? Tabelle 3 hilft uns, die Antwort zu sehen.

Tabelle 3: Tabellarische Analyse für eine binäre Suche ¶

Ungefähre Anzahl der Einträge Left

Wenn wir die Liste oft genug aufgespalten, haben wir am Ende mit einer Liste auf, die nur ein Element hat. Entweder das ist das Element, wir suchen oder es nicht ist. So oder so, sind wir fertig. Die Zahl der Vergleiche notwendig, um diesen Punkt zu gelangen ist i wo \ (\ frac = 1 \). i Die Lösung gibt uns \ (i = \ n \ log). Die maximale Anzahl der Vergleiche ist logarithmisch in Bezug auf die Anzahl der Elemente in der Liste. Daher ist die binäre Suche ist \ (O (\ log n) \).

Eine zusätzliche Analyse Problem muss angegangen werden. In der rekursiven Lösung oben, der rekursive Aufruf gezeigt,

verwendet die slice Bediener die linke Hälfte der Liste zu erstellen, die dann zum nächsten Aufruf (ähnlich für die rechte Hälfte als auch) übergeben wird. Die Analyse, die wir haben angenommen, dass die oben Scheibe Bediener konstant Zeit in Anspruch nimmt. Wir wissen jedoch, dass die Scheibe Operator in Python ist eigentlich O (k). Dies bedeutet, dass die binäre Suche Scheibe verwendet, wird nicht in strikter logarithmischer Zeit auszuführen. Glücklicherweise kann dies, indem man die Liste zusammen mit der Start- und End-Indizes behoben werden. Die Indizes können berechnet werden, wie wir in Listing tat 3. Wir diese Implementierung als Übung verlassen.

    Q-13: Angenommen, Sie die folgende sortierte Liste haben [3, 5, 6, 8, 11, 12, 14, 15, 17, 18] und werden unter Verwendung des rekursiven binären Suchalgorithmus. Welche Gruppe von Zahlen zeigt korrekt die Reihenfolge der Vergleiche verwendet, um den Schlüssel 8 zu finden.
  • (A) 11, 5, 6, 8
  • Sieht aus wie Sie von einem Off-by-one Fehler schuldig sein könnte. Denken Sie daran, die erste Position Index 0.
  • (B) 12, 6, 11, 8
  • Binäre Suche beginnt in der Mitte und halbiert die Liste jedes Mal.
  • (C) 3, 5, 6, 8
  • Binäre Suche beginnt nicht am Anfang und sucht nacheinander seine beginnt in der Mitte und halbiert die Liste nach jedem vergleichen.
  • (D) 18, 12, 6, 8
  • Es scheint, dass Sie vom Ende beginnen und die Liste jedes Mal zu halbieren.
    Q-14: Angenommen, Sie die folgende sortierte Liste haben [3, 5, 6, 8, 11, 12, 14, 15, 17, 18] und werden unter Verwendung des rekursiven binären Suchalgorithmus. Welche Gruppe von Zahlen korrekt zeigt die Reihenfolge der Vergleiche verwendet für den Schlüssel 16 suchen?
  • (A) 11, 14, 17
  • Sieht aus wie Sie von einem Off-by-one Fehler schuldig sein könnte. Denken Sie daran, die erste Position Index 0.
  • (B) 18, 17, 15
  • Denken Sie daran, binäre Suche in der Mitte beginnt und halbiert die Liste.
  • (C) 14, 17, 15
  • Sieht aus wie Sie durch ein aus sein könnte, darauf achten, dass Sie die midpont mit Integer-Arithmetik berechnen.
  • (D) 12, 17, 15
  • Binäre Suche beginnt in der Mitte und halbiert die Liste jedes Mal. Es ist fertig, wenn die Liste leer ist.






In Verbindung stehende Artikel