Binäre Suche

Aus ProgrammingWiki
Archivierte Version vom 2010-10-11T08:24:45+00:00. Aktuelle Version

Inhaltsverzeichnis

Raten einer Zahl

Wir kennen das einfache Spiel zum Raten einer Zahl z im Intervall 1 \le z \le max:
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.
Natürlich wäre ein Erraten der Zahl duch sequenzielle Suche möglich. Allerdings wissen wir, dass die Suche durch Intervallhalbierung wesentlich effizienter ist.
Das Raten einer Zahl soll der Computer übernehmen. Dazu wollen wir selbstverständlich die effizientere Spielstrategie umsetzen:

(computerraten 47 100)
--> (51 26 38 44 47)

Die Prozedur computerraten soll eine Liste mit allen "Versuchszahlen" zurückgeben. Das letzte Listenelement entspricht der zu erratenden Zahl, die Länge der Liste der Anzahl der benötigten Versuche.

<eval id="4bbc334a0d178"> (computerraten 47 100) </eval>

Diese Strategie scheint tatsächlich schnell zum Erfolg zu führen, da in jedem weiteren Rekursionsschritt die Suche auf das halbe Suchintervall reduziert wird.
Man bezeichnet einen derartigen Suchalgorithmus als binäre Suche.
Wir testen unseren Algorithmus mit Zufallszahlen:

<eval id="4bbc334a0e116"> (define zufallszahl</eval>

 (lambda (max)
   (+ 1 (random max))))

(computerraten (zufallszahl 100000) 100000)

Effizienz beim Raten einer Zahl

Wie viele Versuche sind mit binärer Suche im Mittel in einem vorgegebenen Intervall notwendig?
Auch hier wollen wir in grober Näherung davon ausgehen, dass jeder Versuch genau einem "Zeittakt" entspricht.

Empirische Effizienzuntersuchungen

Nun können wir wieder empirische (empirisch: aus der Erfahung oder Beobachtung) Effizienzuntersuchungen vornehmen.
Dazu definieren wir zweckmäßigerweise eine Prozedur computerraten-mehrfach, die im Gegensatz zu computerraten die Anzahl der benötigten Versuche als arithmetisches Mittel mehrerer Versuche zurückgibt.
Dabei wird jeweils eine Zufallszahl aus dem mit max begrenzten Intervall "erraten":

<eval id="4bb9b3a64d8bf"> (computerraten-mehrfach 1000 10) </eval>

Experimente

Wie bei der sequenziellen Suche automatisieren wir das Raten einer Zahl in mehreren Intervallen:

<eval id="4bb9b3a64e85e"> (experiment 100 1000 100 10) </eval>

Die Untersuchungsergebnisse werden auch hier in einem Balkendigramm veranschaulicht:

Ihr Browser unterstützt Canvas nicht.

<eval id="4bb9b3a64f7fe"> (balkendiagramm (experiment 200 10000 200 100)) </eval>

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

  1. Ermitteln Sie für das Raten einer Zahl die mögliche funktionale Abhängigkeit \mbox{Zeitaufwand} = f(\mbox{Problemgr\"o\ss e)}.
    Testen Sie dazu geeignete Regressionsmodelle mit der Tabellenkalkulation oder einem grafikfähigen Taschenrechner.

  2. Die Nullstellensuche in der Kurvendiskussion 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 können sich die Suchintervalle überlappen.
Wir betrachten das Verfahren zunächst für die Suche eines lokalen Minimums:

Extremwert.gif
Animation: Minimumsuche nach dem Verfahren des Goldenen Schnitts

Algorithmus (Minimumsuche):
  • Lege ein Suchintervall durch zwei äußere Intervallgrenzen fest.
  • Zerlege dieses Suchintervall durch einen zweimaligen Goldenen Schnitt in 3 Teilintervalle.
  • Berechne die Funktionswerte an beiden Schnittstellen.
  • Das neue Suchintervall wird aus der Schnittstelle mit dem größeren der beiden Funktionswerte und einer der äußeren Intervallgrenzen derart gebildet, dass die Schnittstelle mit dem kleineren Funktionswert eingeschlossen wird.
  • Führe im neuen Suchintervall den Goldener Schnitt durch, der wieder zu 3 Teilintervallen führt.
  • Wiederhole das Verfahren solange, bis das Suchintervall einer hinreichend kleinen ε-Umgebung genügt.
  • Der Funktionswert eines Arguments aus dieser ε-Umgebung entspricht dem gesuchten Minimum.

Implementieren Sie den Algorithmus zur binären Suche lokaler Extremwerte (Minima und Maxima!) einer beliebigen Funktion.
Denken Sie dabei auch an das Konzept der Prozeduren höherer Ordnung!

Zur Problemlösung.