Binäre Suche
Aus ProgrammingWiki
Inhaltsverzeichnis |
Raten einer Zahl
Wir kennen das einfache Spiel zum Raten einer Zahl im Intervall :
Aus einem zuvor vereinbarten Intervall denkt sich ein Spieler eine Zahl, die sein Mitspieler erraten muss. Nach jedem Versuch erhält der Mitspieler den Hinweis, ob seine vermutete Zahl kleiner bzw. größer als die erdachte Zahl ist oder sogar mit ihr übereinstimmt. Die erdachte Zahl soll so mit einem Minimum an Versuchen erraten werden.
Zunächst spielen wir gegen den Computer und erraten eine Zufallszahl:
Computerraten einer Zahl
Natürlich ist ein Erraten der Zahl durch sequenzielle Suche möglich. Allerdings wissen wir, dass die Suche durch Intervallhalbierung wesentlich effizienter ist.
Das Raten einer Zahl soll nun der Computer übernehmen. Dazu wollen wir selbstverständlich die effizientere Spielstrategie umsetzen:
ComputerRaten(47, 100); --> 5
Die zu implementierende Funktion ComputerRaten soll die Anzahl der benötigten Versuche zurück geben.
Quelltext überprüfen:
Diese Strategie scheint tatsächlich schnell zum Erfolg zu führen, da in jedem weiteren Programmdurchlauf die Suche auf das halbe Suchintervall reduziert wird.
Man bezeichnet einen derartigen Suchalgorithmus als binäre Suche.
Wir testen unseren Algorithmus mit Zufallszahlen:
Effizienz beim Raten einer Zahl
Wie viele Versuche sind mit binärer Suche im Mittel in einem vorgegebenen Intervall notwendig?
Bei unseren weiteren Überlegungen wollen wir davon ausgehen, dass jeder Versuch genau einem "Zeittakt" entspricht.
Empirische Effizienzuntersuchungen
Nun können wir empirische (empirisch: aus der Erfahrung oder Beobachtung) Effizienzuntersuchungen vornehmen.
Dazu definieren wir zweckmäßigerweise eine Funktion ComputerRatenN, die im Gegensatz zu ComputerRaten die Anzahl der benötigten Versuche als arithmetisches Mittel mehrerer Versuche zurück gibt. Dabei werden die Zufallszahlen im mit max begrenzten Intervall "erraten":
Quelltext überprüfen:
Experimente
Wir automatisieren nun das Raten einer Zahl in mehreren Intervallen. Dazu soll die obere Grenze des Suchintervalls von min zu max in einer frei wählbaren schrittweite variiert werden. Der Parameter anzahl beschreibt wieder, wie viele Suchvorgänge in jedem Intervall durchgeführt werden. Die Untersuchungsergebnisse werden in einem Balkendigramm veranschaulicht:
Ergebnisse:
- Die binäre Suche führt im Vergleich zur sequenziellen Suche wesentlich schneller zum Erfolg.
-
Der Zeitaufwand wächst bei zunehmender Problemgröße (Suchintervall) langsamer an.
Offensichtlich ist dieser Algorithmus bei umfassender Problemgröße sehr effizient.
Aufgaben
-
Ermitteln Sie für das Raten einer Zahl die mögliche funktionale Abhängigkeit
.
Testen Sie dazu geeignete Regressionsmodelle mit der Tabellenkalkulation oder einem grafikfähigen Taschenrechner. -
Die Nullstellensuche durch Intervallschachtelung ist eine typische Anwendung der binären Suche.
Verallgemeinern Sie das Raten einer Zahl und die Nullstellensuche zu einer Problemklasse, auf die eine binäre Suche anwendbar ist.
Zum Weiterarbeiten
Extremwertsuche nach dem Verfahren des Goldenen Schnitts
Die binäre Suche muss nicht zwingend zur Intervallhalbierung führen.
Ein interessanter Algorithmus ist die Extremwertsuche nach dem Verfahren des Goldenen Schnitts. Dabei werden die Suchintervalle asymmetrisch geteilt.
Wir betrachten das Verfahren zunächst für die Suche eines lokalen Minimums:
Implementieren Sie den Algorithmus zur binären Suche lokaler Extremwerte (Minima und Maxima!) einer zuvor definierten mathematischen Funktion.
Legen Sie dazu unter Ihrem PWiki-Zugang eine neue Seite mit der Bezeichnung <PWiki-Name>/Extremwertsuche an.
Zum Erwartungsbild.