Binärsuche: schnell in sortierten Daten finden
Kurz: Die Binärsuche halbiert in jedem Schritt den Suchbereich einer sortierten Liste und braucht dadurch nur logarithmisch viele Vergleiche statt linear vieler.
Genauer: Wie beim Raten einer Zahl zwischen 1 und 100 („größer/kleiner?“): Immer in die Mitte schauen, dann die falsche Hälfte wegwerfen. Voraussetzung: Die Daten sind sortiert und der Zugriff auf beliebige Position ist schnell (Array).
Im Detail
Idee und Ablauf
links = 0,rechts = n − 1.mitte = links + (rechts − links) / 2.- Ist
a[mitte] == ziel→ gefunden. Ista[mitte] < ziel→links = mitte + 1, sonstrechts = mitte − 1. - Wiederholen, bis
links > rechts(nicht gefunden). Beispiel: Suche 23 in[2, 5, 8, 12, 16, 23, 38, 56, 72, 91]: Mitte 16 < 23 → rechte Hälfte; Mitte 56 > 23 → links; Mitte 23 → gefunden nach 3 Schritten.
Code
def binaersuche(a, ziel):
links, rechts = 0, len(a) - 1
while links <= rechts:
mitte = links + (rechts - links) // 2 # vermeidet Überlauf
if a[mitte] == ziel:
return mitte
if a[mitte] < ziel:
links = mitte + 1
else:
rechts = mitte - 1
return -1In Python: Modul bisect (bisect_left), in Java Arrays.binarySearch, JavaScript manuell, C++ std::binary_search/lower_bound. Typische Fehler: Off-by-one bei den Grenzen, Überlauf bei (l + r) / 2 in festen Integer-Typen, Endlosschleifen durch falsche Grenzänderung, unsortierte Daten.
Laufzeit
Pro Schritt halbiert sich der Bereich: höchstens ⌈log₂ n⌉ + 1 Vergleiche. 1 Million Einträge: ≈ 20 Vergleiche; 1 Milliarde: ≈ 30. Die lineare Suche braucht im Mittel n/2. Aufwand: O(log n). Aber: Sortieren kostet O(n log n); lohnt sich, wenn oft gesucht wird. Bei Listen (verkettet) bringt Binärsuche nichts (kein Direktzugriff), dafür Suchbäume/B-Bäume/Indizes.
Varianten und Anwendungen
- Untere/obere Schranke (erste/letzte Position eines Werts, Einfügeposition).
- Binärsuche auf der Antwort: „kleinste Kapazität, sodass Lieferung in 5 Tagen klappt“ (Monotonie nutzen).
- Wurzel/Nullstelle (Bisektionsverfahren).
git bisect: findet den fehlerhaften Commit in log₂(n) Schritten.- Datenbank-Indizes, Telefonbuch, Wörterbuch, Sortierte Dateien, Autovervollständigung.
- Prüfungs-Tipp (IHK): Schrittzahl für n Elemente herleiten (
2^k ≥ n).
Siehe auch: Big-O-Notation, Sortieren, B-Baum