Kurs
Stell dir ein Ratespiel vor: Du sollst eine bestimmte Zahl zwischen 1 und 100 finden. Du könntest wahllos raten – im Worst Case bräuchtest du bis zu 100 Versuche, um die richtige Zahl zu treffen.
Schneller geht es, wenn du mit der Mitte startest, also 50, und fragst, ob die Zielzahl größer oder kleiner ist. Ist sie größer, kannst du alles unter 50 ignorieren und mit 51–100 weitermachen. So fährst du fort, bis du die richtige Zahl gefunden hast.
Indem du den Suchraum jedes Mal halbierst, näherst du dich dem Ziel blitzschnell. Selbst im Worst Case brauchst du so maximal 7 Versuche. Diese Strategie ist das Prinzip der binären Suche.
In diesem Guide schauen wir uns an, was die binäre Suche ist, wofür sie praktisch eingesetzt wird und wie du sie in Python sowohl iterativ als auch rekursiv implementierst. Für einen umfassenden Kurs sieh dir unseren Kurs Data Structures and Algorithms in Python an. Er behandelt die binäre Suche im Detail – zusammen mit weiteren wichtigen Suchalgorithmen wie linear search, depth first search und breadth first search.
Was ist binäre Suche?
Wenn du in einem Datensatz nach einem Wert suchst, willst du dessen Index bzw. Position finden, um den Wert im Code einfach abzurufen und weiterzuverwenden. Es gibt mehrere Suchalgorithmen, die dir helfen, den Index eines bestimmten Werts zu finden. Einer der effizientesten und grundlegendsten Ansätze ist die binäre Suche.
Fähigkeiten im Bereich Machine Learning aufbauen
Allgemein gesprochen ist ein Algorithmus eine präzise Abfolge von Anweisungen, denen ein Computer folgt, um eine bestimmte Aufgabe zu erledigen oder ein Problem zu lösen. Lies unseren Blogpost What is an Algorithm, um mehr über die vielen Algorithmusarten im Machine Learning zu erfahren.
Konzepte im Überblick
Die binäre Suche ist ein leistungsstarker Algorithmus, der schnell einen Wert in einem sortierten Datensatz findet. Die Idee dahinter ist simpel: Statt wie bei der linearen Suche jedes Element nacheinander zu prüfen, halbiert die binäre Suche den Suchbereich in jedem Schritt – und wird dadurch viel schneller.
So funktioniert’s:
- Vergleiche den Zielwert zunächst mit dem mittleren Element des Datensatzes. Der Index des mittleren Elements wird berechnet als middle = (low + high) / 2, wobei low der Index des ersten Elements im aktuellen Suchbereich ist und high der Index des letzten Elements.
- Vergleiche den Mittelwert mit dem Ziel. Ist der Zielwert gleich dem mittleren Element, hast du den Index gefunden und die Suche ist beendet. Ist der Zielwert kleiner, suchst du in der linken Hälfte weiter. Ist er größer, suchst du in der rechten Hälfte weiter.
- Wiederhole Schritt 1–2. Der Suchbereich wird in jedem Schritt halbiert. Fahre fort, bis der Zielwert gefunden ist oder der Suchbereich leer wird.

Der Ablauf der binären Suche. Bild: Autorin/Autor
Oben siehst du ein vereinfachtes Beispiel, das das Prinzip der binären Suche zeigt.
Dieses Halbieren macht die binäre Suche so effizient. Wichtig ist aber: Der Datensatz muss sortiert sein, damit die binäre Suche korrekt funktioniert. Ist er nicht sortiert, liefert der Algorithmus nicht die gewünschten Ergebnisse.
Sieh dir auch Data Structures: A Comprehensive Guide With Python Examples an, um mehr über verschiedene Datenstrukturen zu erfahren, in denen du suchen kannst.
Wichtige Punkte zum Merken
Die folgenden Punkte fassen die Kernprinzipien der binären Suche zusammen.
Effizienz
Die binäre Suche ist deutlich schneller als die lineare Suche, vor allem bei großen Datensätzen. Während die lineare Suche eine Zeitkomplexität von O(n) hat (im schlimmsten Fall muss jedes Element geprüft werden), ist die binäre Suche effizienter: Mit O(log n) wird der Suchraum in jedem Schritt halbiert – das reduziert die Anzahl der Vergleiche erheblich.
Eine detaillierte Einordnung, wie Algorithmen bewertet werden, findest du in unserem Big-O-Notation- und Zeitkomplexitäts-Guide: Intuition und Mathematik. Eine weitere Option ist das Tutorial Analyzing Complexity of Code through Python.
Voraussetzungen
Damit die binäre Suche funktioniert, muss der Datensatz auf- oder absteigend sortiert sein. Das ist notwendig, weil der Algorithmus die Ordnung der Elemente nutzt, um zu entscheiden, welche Hälfte als Nächstes durchsucht wird. Ohne Sortierung kann die binäre Suche den Zielwert nicht zuverlässig finden.
Flexibilität
Die binäre Suche lässt sich iterativ oder rekursiv implementieren. Die iterative Methode nutzt Schleifen, um den Suchraum wiederholt zu halbieren. Bei der rekursiven Methode ruft sich die Funktion selbst mit kleinerem Suchbereich auf. Diese Flexibilität macht sie vielseitig einsetzbar.
Anwendungen in der Praxis
Die binäre Suche ist ein starkes Werkzeug. Ihre Effizienz beim schnellen Eingrenzen des Suchraums ist besonders bei großen Datensätzen Gold wert, wenn Performance und Geschwindigkeit entscheidend sind. Schauen wir uns konkrete Anwendungen an und vergleichen sie mit anderen Algorithmen.
Datenbanken
In Datenbanken wird die binäre Suche oft genutzt, um Datensätze in sortierten Feldern schnell zu finden – etwa eine bestimmte Nutzerin bzw. einen bestimmten Nutzer in einer nach User-ID sortierten Tabelle. Stell dir Millionen von Einträgen vor: Eine lineare Suche müsste einen Datensatz nach dem anderen scannen. Die binäre Suche halbiert den Suchraum systematisch und reduziert so die nötigen Vergleiche drastisch.
Data Science
Das Durchsuchen großer, sortierter Datensätze ist in der Data Science Alltag. In der Zeitreihenanalyse kann die binäre Suche z. B. genutzt werden, um bestimmte Zeitstempel in einer sortierten Ereignisfolge zu finden. Im Machine Learning helfen binäre Suchstrategien beim Optimieren von Hyperparametern, indem sie in einem Bereich den besten Wert eingrenzen.
Computergrafik
In der Computergrafik kommt die binäre Suche in Algorithmen zum Einsatz, bei denen Präzision und Geschwindigkeit gefragt sind. Ein Beispiel ist Raytracing, eine Rendering-Technik zur Simulation von Licht. Hier kann die binäre Suche Schnittpunkte zwischen Strahlen und Oberflächen schnell finden.
Baustein für komplexere Algorithmen
Die binäre Suche ist nicht nur für sich nützlich, sondern auch ein Baustein für komplexe Algorithmen und Datenstrukturen. Suchbäume wie Binary Search Trees (BSTs) und balancierte Bäume wie AVL-Bäume basieren auf ihren Prinzipien. Sie ermöglichen effizientes Suchen, Einfügen und Löschen – ideal, wenn Daten dynamisch aktualisiert und häufig durchsucht werden. Mehr dazu im Guide AVL Tree: Complete Guide With Python Implementation.
Binäre Suche vs. andere Suchalgorithmen
Schauen wir, wie sich die binäre Suche im Vergleich zu zwei gängigen Alternativen schlägt: linearer Suche und Hash-Lookup.
Lineare Suche
Die lineare Suche prüft die Elemente eines Datensatzes der Reihe nach. Sie ist deutlich weniger effizient als die binäre Suche und hat eine Zeitkomplexität von O(n). Dafür benötigt sie keine Sortierung der Daten und ist in manchen Szenarien daher praktikabel.
Hash-Lookup
Der Hash-Lookup findet Werte effizient, wenn sie eindeutigen Schlüsseln zugeordnet sind. Eine Hashfunktion berechnet aus dem Schlüssel den Index, unter dem der Wert in einer Hashtabelle liegt. Der Abruf gelingt dadurch quasi sofort, oft in O(1). Allerdings braucht das zusätzliche Speicher für die Hashtabelle und eignet sich nicht für Bereichssuchen – dafür ist die binäre Suche die bessere Wahl.
Binäre Suche in Python implementieren
Wir schauen uns nun verschiedene Wege an, eine einfache binäre Suche in Python umzusetzen. Zuerst brauchen wir einen kleinen, sortierten Datensatz und einen Zielwert. Stell dir folgendes sortiertes Array und das Suchziel vor:
arr = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
target = 56
Iterative Methode
Die iterative Methode ist wahrscheinlich der direkteste Ansatz. Dabei halbierst du mit einer while-Schleife den Suchbereich immer wieder, bis du das Ziel findest. Diese Methode ist wegen ihrer Klarheit und Effizienz beliebt.
So implementierst du die binäre Suche iterativ:
def binary_search_iterative(arr, target):
# Definiere die Suchgrenzen
left, right = 0, len(arr) - 1
while left <= right:
# Berechne den mittleren Index
mid = left + (right - left) // 2
# Wenn das mittlere Element dem Ziel entspricht, gib den Index zurück
if arr[mid] == target:
return mid
# Ist das Ziel größer, suche in der rechten Hälfte weiter
elif arr[mid] < target:
left = mid + 1
# Ist das Ziel kleiner, suche in der linken Hälfte weiter
else:
right = mid - 1
# Gib -1 zurück, wenn das Ziel nicht gefunden wurde
return -1
# Führe die iterative Funktion aus
result = binary_search_iterative(arr, target)
if result != -1:
print(f"Iterative: Target found at index {result}")
else:
print("Iterative: Target not found")
Schauen wir uns den Code genauer an:
-
Wir setzen
leftundrightals Grenzen des Suchraums. Anfangs istleft0(Beginn des Arrays) undrightlen(arr) - 1(Ende des Arrays). -
In jeder Iteration berechnen wir den mittleren Index, also die Mitte des aktuellen Suchintervalls. Das geschieht mit der Formel
mid = left + (right - left) /2. -
Dann vergleichen wir das Element an
midmit demtarget: -
Bei Übereinstimmung haben wir das Ziel gefunden und die Funktion gibt
midzurück. -
Ist das Element an
midkleiner als das Ziel, muss das Ziel rechts liegen. Wir setzenleftaufmid + 1. -
Ist das Element an
midgrößer, muss das Ziel links liegen. Wir setzenrightaufmid - 1. -
Die Schleife läuft, bis das Ziel gefunden ist oder
leftgrößer alsrightwird – dann ist das Ziel nicht im Array.
Rekursive Methode
Die rekursive Methode ist eine alternative Implementierung. Anstatt einer Schleife ruft sich die Funktion selbst auf und passt jedes Mal die Suchgrenzen an, bis das Ziel gefunden wird oder feststeht, dass es nicht vorhanden ist.
So implementierst du die binäre Suche rekursiv:
def binary_search_recursive(arr, target, left, right):
# Wenn sich die Suchgrenzen kreuzen, ist das Ziel nicht im Array
if left > right:
return -1
# Berechne den mittleren Index
mid = left + (right - left) // 2
# Wenn der Mittelwert dem Ziel entspricht, gib den Index zurück
if arr[mid] == target:
return mid
# Ist das Ziel größer als der Mittelwert, suche rechts weiter
elif arr[mid] < target:
return binary_search_recursive(arr, target, mid + 1, right)
# Ist das Ziel kleiner als der Mittelwert, suche links weiter
else:
return binary_search_recursive(arr, target, left, mid - 1)
# Führe die rekursive Funktion aus
result = binary_search_recursive(arr, target, 0, len(arr) - 1)
if result != -1:
print(f"Iterative: Target found at index {result}")
else:
print("Iterative: Target not found")
Schauen wir uns den Code genauer an:
-
Die rekursive Funktion startet mit denselben Anfangsgrenzen
leftundrightwie die iterative Variante. -
Zuerst prüft sie, ob
leftgrößer alsrightist. Wenn ja, gibt sie-1zurück – das Ziel ist nicht im Array. -
Andernfalls berechnet die Funktion den Index
midund vergleicht das Element anmidmit dem Ziel. -
Wenn Ziel und Element an
midübereinstimmen, gibt siemidzurück. -
Ist das Ziel größer als das Element an
mid, ruft sie sich mit angepassten Grenzen für die rechte Hälfte erneut auf. -
Ist das Ziel kleiner, durchsucht sie die linke Hälfte.
-
Die Rekursion läuft weiter, bis das Ziel gefunden ist oder der Suchraum erschöpft ist.
Mehr zu rekursiven Funktionen findest du in Understanding Recursive Functions in Python.
Das eingebaute bisect-Modul in Python nutzen
Pythons Standardbibliothek enthält das Modul bisect mit vorimplementierten Funktionen für binäre Suche. Das ist sehr effizient und spart oft Zeit gegenüber einer Eigenimplementierung.
So findest du das Ziel mit bisect in unserem Array:
# Importiere das bisect-Modul
import bisect
# Rufe die Funktion auf und übergib Array und Zielwert
index = bisect.bisect_left(arr, target)
# Ergebnisse ausgeben
if index < len(arr) and arr[index] == target:
print(f"Bisect: Target found at index {index}")
else:
print("Bisect: Target not found")
Schauen wir uns den Code genauer an:
-
Die Funktion
bisect_leftgibt den Index zurück, an dem der Zielwert eingefügt werden müsste, um die Sortierung zu erhalten. Steht an diesem Index bereits der Zielwert, ist er im Array vorhanden. -
Diese Methode ist besonders nützlich bei sortierten Arrays und kann auch verwendet werden, um Elemente sortiert einzufügen.
-
Das Modul
bisectbietet außerdem Funktionen wiebisect_rightundinsort, um Einfügepositionen zu finden oder Elemente direkt einzufügen.
Werde ein ML-Wissenschaftler
Zeit- und Speicherkomplexität
Wenn wir über die Effizienz eines Algorithmus sprechen, verwenden wir oft die Big-O-Notation, geschrieben als O(x), um zu beschreiben, wie Laufzeit oder Speicherbedarf mit der Eingabegröße wachsen. Für die binäre Suche beträgt die Zeitkomplexität typischerweise O(log n). Das bedeutet: Mit wachsendem Datensatz steigt die Anzahl der nötigen Operationen nur logarithmisch – daher ist die binäre Suche selbst für große Daten effizient.
Die iterative Variante hat eine Zeitkomplexität von O(log n), weil das Suchintervall pro Iteration halbiert wird. Ihre Speicherkomplexität ist O(1), da nur eine konstante Anzahl zusätzlicher Variablen für Grenzen und Mitte nötig ist.
Die rekursive Methode hat aus demselben Grund ebenfalls O(log n) Zeitkomplexität. Ihre Speicherkomplexität ist jedoch O(log n), weil für jeden rekursiven Aufruf Platz auf dem Call-Stack benötigt wird. Die Rekursionstiefe entspricht der Anzahl der Halbierungsschritte – also logarithmisch zur Datensatzgröße.
Beide Methoden sind zeitlich effizient, aber die iterative Variante ist speicherschonender. Darum setzt das bisect-Modul unter der Haube iterativ um. Auch ich bevorzuge den iterativen Ansatz aus diesem Grund. Für manche ist die rekursive Variante jedoch intuitiver und benötigt teils weniger Codezeilen.
Häufige Fallstricke – und wie du sie vermeidest
Bei der binären Suche gibt es ein paar typische Stolpersteine, die sich auf Korrektheit und Effizienz auswirken können.
Erstens: Die binäre Suche setzt einen sortierten Datensatz voraus. Ist er unsortiert, funktioniert sie nicht zuverlässig – sie kann falsche Ergebnisse liefern oder ganz scheitern. Sortiere also vor der Suche. Wenn Sortieren nicht möglich ist, ist die binäre Suche nicht das passende Werkzeug.
Ein häufiger Fehler sind Off-by-one-Fehler. Kleine Ungenauigkeiten bei Indexberechnungen können zu Endlosschleifen führen oder dazu, dass das Ziel übersehen wird. Das passiert, wenn die Berechnung der Mitte oder die Anpassung der Grenzen nicht exakt erfolgt. Achte daher auf korrekte Berechnungen und Updates nach jedem Vergleich. Denk daran: Indizes in Python starten bei 0, nicht bei 1.
Wenn du die binäre Suche rekursiv nutzt, kann zudem die Rekursionstiefe zum Problem werden. Python begrenzt die Anzahl rekursiver Aufrufe, um Speicher zu schützen. Bei sehr großen Datensätzen kann tiefe Rekursion diesen Grenzwert überschreiten und zu einem Stack Overflow führen. Nutze in solchen Fällen besser die iterative Variante, die nicht von der Rekursionstiefe abhängt. Falls Rekursion nötig ist, lässt sich das Limit mit sys.setrecursionlimit() erhöhen – das solltest du jedoch mit Vorsicht tun.
Fazit
Die binäre Suche ist ein leistungsfähiger, effizienter Algorithmus, der in keinem Toolkit von Python-Entwicklerinnen und -Entwicklern fehlen sollte. Ob iterativ oder rekursiv implementiert: Gegenüber der linearen Suche bringt sie vor allem bei großen Datensätzen klare Performancevorteile. Mehr dazu findest du im DataCamp Lernpfad Python Programming oder im interaktiven Kurs Software Engineering Principles in Python.
Ich bin promoviert und habe 13 Jahre Erfahrung in der Arbeit mit Daten in der biologischen Forschung. Ich entwickle Software in verschiedenen Programmiersprachen, darunter Python, MATLAB und R. Meine Leidenschaft ist es, meine Liebe zum Lernen mit der Welt zu teilen.
FAQs zur binären Suche
In welchen realen Szenarien ist die binäre Suche oft ineffizient?
Wenn Daten unsortiert sind oder sich häufig ändern, kann Sortieren ausbremsen – dann verliert die binäre Suche an Effizienz.
Kann man die binäre Suche bei anderen Datenstrukturen wie Linked Lists einsetzen?
Nein. Auf das mittlere Element einer verketteten Liste zuzugreifen, kostet lineare Zeit – damit geht der Geschwindigkeitsvorteil der binären Suche verloren.
Wie geht die binäre Suche mit doppelten Werten in einem Datensatz um?
Die binäre Suche findet eine Vorkommnis. Um alle Duplikate zu ermitteln, musst du zusätzlich die Unter- und Obergrenze der Treffer suchen.
Welchen Vorteil hat das bisect-Modul in Python gegenüber einer eigenen Implementierung?
Das Modul bisect ist optimiert, zuverlässig und bietet Extras wie das Einfügen bei erhaltener Sortierung.
Wie lässt sich die binäre Suche auf nicht-numerische Datensätze anwenden, z. B. auf sortierten Text oder Zeichenketten?
Die binäre Suche funktioniert auch für sortierten Text, indem Elemente lexikografisch verglichen werden.
