Binäre Suche: Ablauf, Beispiel und Laufzeit
Die binäre Suche findet einen Wert in einer sortierten Folge, indem sie den Suchbereich nach jedem Vergleich ungefähr halbiert. Dazu prüfst du immer das mittlere Element und entscheidest, ob nur links oder nur rechts weitergesucht werden muss.
Hake ab, was du schon kannst — und komm am Ende hierher zurück!
Warum muss die Folge sortiert sein?
Stell dir vor, du vergleichst den Suchwert mit dem mittleren Element. Nur bei einer sortierten Folge kannst du daraus sicher ableiten, welche Hälfte nicht mehr infrage kommt.
Ist der Suchwert kleiner als der mittlere Wert, kann er nur links davon liegen. Ist er größer, kann er nur rechts davon liegen. Genau dieses Ausschließen einer ganzen Hälfte macht die binäre Suche schnell.
Suchbereich
Der Suchbereich umfasst alle Positionen, an denen der gesuchte Wert noch liegen kann. Seine Grenzen heißen hier links und rechts; beide gehören zum Bereich.
Binäre Suche und Sortierung müssen dieselbe Ordnung verwenden. In einem nach Namen sortierten Telefonbuch kannst du binär nach einem Namen suchen, aber nicht unmittelbar nach einer Telefonnummer.
Ohne passende Sortierung darfst du keine Hälfte ausschließen. Dann kann die binäre Suche ein vorhandenes Element übersehen.
Wie läuft die binäre Suche ab?
Für ein Array mit den Indizes 0 bis n - 1 setzt du zunächst links = 0 und rechts = n - 1.
Dann wiederholst du diese Schritte, solange links <= rechts gilt:
- Berechne die Mitte mit
mitte = links + (rechts - links) // 2.//bedeutet ganzzahlige Division mit Abrunden. - Vergleiche den Wert an der Position
mittemit dem Suchwert. - Bei Gleichheit ist die Suche erfolgreich.
- Ist der mittlere Wert größer, setze
rechts = mitte - 1. - Ist der mittlere Wert kleiner, setze
links = mitte + 1.
Die Mitte selbst wurde bereits geprüft. Deshalb wird sie durch mitte - 1 oder mitte + 1 aus dem neuen Bereich entfernt. Ohne dieses Vorbeibewegen könnten Grenzen stehen bleiben und die Schleife endlos laufen.
Die verwendete Mittenformel ist außerdem robuster als (links + rechts) / 2, weil die Addition der beiden möglicherweise großen Indizes vermieden wird.
Gesucht ist 75 in der sortierten Liste
[4, 12, 15, 15, 21, 27, 40, 41, 70, 75, 75, 99].
Die Indizes reichen von 0 bis 11.
| Schritt | links | rechts | mitte | Wert | Entscheidung |
|---|---|---|---|---|---|
| 1 | 0 | 11 | 5 | 27 | 75 > 27, also rechts weitersuchen |
| 2 | 6 | 11 | 8 | 70 | 75 > 70, also rechts weitersuchen |
| 3 | 9 | 11 | 10 | 75 | gefunden |
Die Suche liefert hier Index 10. Da 75 zweimal vorkommt, hätte eine andere zulässige Mittenregel auch die andere passende Position liefern können.
Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.
Ist der mittlere Wert größer als das Ziel, wird der Rand verschoben. Ist er kleiner, wird der Rand verschoben. Bei Gleichheit ist der Wert . Die geprüfte Mitte wird durch mitte - 1 oder mitte + 1 aus dem neuen Suchbereich .
Woran erkennst du eine erfolglose Suche?
Ein Wert fehlt, wenn der Suchbereich leer wird. Das erkennst du an links > rechts: Der linke Rand liegt dann rechts vom rechten Rand, also bleibt keine ungeprüfte Position übrig.
Nun wird 76 in derselben Liste gesucht.
| Schritt | links | rechts | mitte | Wert | Entscheidung |
|---|---|---|---|---|---|
| 1 | 0 | 11 | 5 | 27 | links = 6 |
| 2 | 6 | 11 | 8 | 70 | links = 9 |
| 3 | 9 | 11 | 10 | 75 | links = 11 |
| 4 | 11 | 11 | 11 | 99 | rechts = 10 |
Danach gilt links = 11 und rechts = 10. Der Bereich ist leer, also kommt 76 nicht vor. Zugleich zeigt links = 11 die Position, an der 76 eingefügt werden müsste, damit die Liste sortiert bleibt.
Programme können einen Misserfolg unterschiedlich melden, etwa mit -1, None oder einer Einfügeposition. Diese Rückgabekonvention gehört zur jeweiligen Implementierung; das Abbruchkriterium bleibt der leere Suchbereich.
Duplikate sind erlaubt. Die Grundform der binären Suche verspricht jedoch nur irgendeine passende Position. Soll ausdrücklich das erste oder letzte Vorkommen gefunden werden, muss der Algorithmus erweitert werden.
Warum ist die binäre Suche schnell?
Eine lineare Suche prüft die Elemente der Reihe nach und benötigt im ungünstigsten Fall bis zu n Vergleiche. Die binäre Suche verwirft nach jedem Vergleich ungefähr die Hälfte der noch möglichen Positionen.
Bei 12 Elementen genügen im schlechtesten Fall 4 Vergleiche. Das passt zur Formel
$$\left\lceil\log_2(n+1)\right\rceil$$
Denn für n = 12 gilt: 2³ = 8 < 13 <= 16 = 2⁴. Daher ist die aufgerundete Zweierlogarithmus-Zahl 4.
Allgemein wächst die Laufzeit im schlechtesten Fall wie
$$\mathcal O(\log n)$$
Der beste Fall benötigt nur einen Vergleich: Das zuerst geprüfte mittlere Element ist bereits der Suchwert.
Laufzeit
Die Laufzeit beschreibt hier, wie die Zahl der nötigen Vergleichsschritte mit der Größe n der Eingabe wächst. Sie ist nicht mit einer konkreten Zeit in Sekunden gleichzusetzen.
Vertiefung: Iteration und Rekursion
Eine iterative Umsetzung aktualisiert links und rechts in einer Schleife und benötigt konstanten zusätzlichen Speicher, also $\mathcal O(1)$.
Eine rekursive Umsetzung halbiert denselben Bereich durch Funktionsaufrufe. Dafür werden Aufrufzustände gespeichert; der zusätzliche Speicherbedarf wächst bis zu $\mathcal O(\log n)$.
Der Geschwindigkeitsvorteil gilt nur, wenn die Daten bereits passend sortiert sind und direkt auf das mittlere Element zugegriffen werden kann. Bei einer einfachen verketteten Liste kostet schon das Erreichen der Mitte zusätzlichen Aufwand. Muss eine unsortierte Folge erst sortiert werden, gehört auch dieser Aufwand zur Gesamtbetrachtung.
Karteikasten
Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.
Alles auf einen Blick
- Binäre Suche
- Voraussetzung
- passend sortierte Folge
- direkter Zugriff auf die Mitte
- Vergleich mit der Mitte
- kleiner: links weitersuchen
- größer: rechts weitersuchen
- gleich: Position gefunden
- Abbruch
- Fund bei Gleichheit
- Misserfolg bei `links > rechts`
- Eigenschaften
- ungefähr halbierter Suchbereich
- Laufzeit $\mathcal O(\log n)$
- Duplikatposition nicht festgelegt
- Voraussetzung
Abschluss-Check
Du beherrschst die binäre Suche, wenn du vor dem Start die Sortierung prüfst, nach jedem Vergleich die richtige Grenze an der Mitte vorbeibewegst und bei links > rechts sicher auf Misserfolg schließt.
Mit Google fortfahren