Informatik · Klasse 7–13 · aktualisiert
Binäre Suche: Ablauf, Beispiel und Laufzeit
Du lernst, warum die binäre Suche eine sortierte Folge braucht, wie links, rechts und mitte wandern und wie sie fehlende Werte erkennt.
0 von 9 Aufgaben gelöst
Kurz gesagt
Die binäre Suche ist ein Algorithmus, der in einem sortierten Array ein Element sehr effizient findet oder zuverlässig ausschließt, dass es vorhanden ist. Sie vergleicht mit der Mitte und schließt jedes Mal eine Hälfte aus. Ihr Aufwand O(log n) wächst nur langsam, wenn die Liste größer wird.
Wenn du ein Wort im Wörterbuch suchst, blätterst du nicht Seite für Seite. Du schlägst irgendwo in der Mitte auf und weißt sofort, ob du weiter vorn oder weiter hinten suchen musst. Genau so arbeitet die binäre Suche. Hier lernst du, wann das klappt und wie viele Schritte sie höchstens braucht.
Deine Lernziele
Hake ab, was du schon kannst. Löst du alle Aufgaben eines Abschnitts, hakt Mela das Ziel für dich ab.
3 Abschnitte
Ein Array ist eine Reihe von Werten. Jeder Wert hat eine Nummer, den Index, und der Index beginnt bei 0. Ein Algorithmus ist eine Schritt-für-Schritt-Anleitung. Die binäre Suche ist ein Algorithmus, der in einem Array sehr effizient ein gesuchtes Element findet oder zuverlässig ausschließt, dass es vorhanden ist.
Voraussetzung ist, dass die Elemente sortiert sind. Hier sind die Werte von links nach rechts aufsteigend sortiert. Gleiche Werte dürfen mehrfach vorkommen. Kommt der Suchwert mehrmals vor, ist nicht festgelegt, welche Position ausgegeben wird.
Der Grund: Du vergleichst den Suchwert mit dem Wert in der Mitte. Weil die Folge sortiert ist, kannst du danach eine ganze Hälfte ausschließen. Ist der Suchwert kleiner als der Vergleichswert, kann er nur in der linken Hälfte stehen. Ist er größer, kann er nur in der rechten Hälfte stehen. Ohne Sortierung gilt dieser Schluss nicht. Die lineare Suche (sie geht der Reihe nach vor) hat dafür den Vorteil, auch in unsortierten Arrays zu funktionieren.
Noch zwei Bedingungen: Die Daten müssen bereits sortiert sein und so vorliegen, dass man direkt auf das n-te Element zugreifen kann. Und die Suche muss zur Sortierung passen.
Definition
Binäre Suche
Die binäre Suche ist ein Algorithmus, der in einem sortierten Array ein gesuchtes Element findet oder dessen Vorhandensein zuverlässig ausschließt.
Beispiel: Telefonbuch
- 1Ein Telefonbuch ist nach Namen sortiert.
- 2Nach einem bestimmten Namen kannst du mit binärer Suche suchen.
- 3Nach einer bestimmten Telefonnummer geht das nicht, denn danach ist das Telefonbuch nicht sortiert.
Merke: Sortiert heißt: Nach dem Vergleich mit der Mitte fällt eine ganze Hälfte weg. Ordnung und Suche müssen sich auf dasselbe beziehen.
Teste dich
Du arbeitest mit drei Zahlen: links, rechts und mitte. Die Zahlen links und rechts sind die Ränder des Suchbereichs, beide gelten einschließlich. Am Anfang umfasst der Suchbereich das komplette Array: links = 0 und rechts = len(folge) - 1. Dabei ist len(folge) die Anzahl der Elemente.
In jedem Schritt berechnest du die Mitte: mitte = links + (rechts - links) // 2. Das Zeichen // bedeutet: ganzzahlig teilen, also den Rest weglassen. Dann vergleichst du den Wert an der Position mitte mit dem Suchwert. Sind beide gleich, ist die Suche erfolgreich beendet und du gibst die Position mitte aus.
Ist der Suchwert kleiner als der Wert in der Mitte, schränkst du den rechten Rand ein: rechts = mitte - 1. Ist er größer, schränkst du den linken Rand ein: links = mitte + 1. Danach wiederholst du alles mit dem kleineren Suchbereich.
Warum rechnet man nicht einfach (links + rechts) // 2? In Sprachen mit begrenzten Ganzzahlen kann bei großen Arrays die Addition links + rechts zu einem Überlauf führen (die Zahl wird zu groß für den Datentyp). Deshalb wird links + (rechts - links) // 2 verwendet.
Beispiel: Die Zahl 10 suchen (erfundenes Beispiel)
- 1Folge [2, 4, 6, 8, 10, 12, 14] mit den Indizes 0 bis 6, gesucht ist 10. Start: links = 0, rechts = 6
- 2mitte = 0 + (6 - 0) // 2 = 3, Wert 8. Da 8 kleiner als 10 ist, gilt links = 3 + 1 = 4
- 3mitte = 4 + (6 - 4) // 2 = 5, Wert 12. Da 12 größer als 10 ist, gilt rechts = 5 - 1 = 4
- 4mitte = 4 + (4 - 4) // 2 = 4, Wert 10: gefunden, Position 4 nach 3 Vergleichen
Merke: Wert in der Mitte zu groß: rechts = mitte - 1. Wert in der Mitte zu klein: links = mitte + 1. Die Mitte ist schon verglichen, deshalb liegt der neue Rand daneben.
Teste dich
Ist der Suchbereich leer, wurde der Suchwert nicht gefunden. Die Suche ist erfolglos beendet. Im Beispielcode läuft die Schleife, solange links <= rechts gilt. Sobald links größer als rechts ist, ist der Suchbereich leer.
Der Beispielcode gibt dann „Lücke“ mit dem Wert von links zurück. Bei „Lücke x“ ist x der Index, an dem das gesuchte Element eingefügt werden müsste, damit die Folge sortiert bleibt. Andere Programme geben stattdessen einen Fehlercode zurück, möglicherweise ergänzt durch die Position, an der der Suchwert stehen würde.
Zum Aufwand: In jedem Schritt wird die Länge des Suchbereichs halbiert. Deshalb braucht man bei n Einträgen maximal ⌈log₂(n+1)⌉ Vergleichsschritte. Die Klammern ⌈ ⌉ bedeuten aufrunden. Die Zeitkomplexität sagt, wie stark der Aufwand wächst, wenn die Liste größer wird. Bei der binären Suche ist sie O(log n). Damit ist die binäre Suche deutlich schneller als die lineare Suche. Die Tabelle zeigt, wie langsam die Zahl der Vergleiche wächst.
In einer sortierten Liste mit 13 Buchstaben wären auch im schlechtesten Fall nur 4 Vergleiche nötig. Die lineare Suche müsste im ungünstigsten Fall bis zu 13 Elemente untersuchen. Der Vorteil fällt umso stärker ins Gewicht, je größer die Liste ist.
Definition
Lücke x
Bei „Lücke x“ ist x der Index, an dem der gesuchte Wert eingefügt werden müsste, damit die Folge sortiert bleibt.
Beispiel: Die Zahl 5 suchen (erfundenes Beispiel)
- 1Folge [2, 4, 6, 8, 10, 12, 14], gesucht ist 5. Start: links = 0, rechts = 6
- 2mitte = 3, Wert 8. Da 8 größer als 5 ist, gilt rechts = 3 - 1 = 2
- 3mitte = 0 + (2 - 0) // 2 = 1, Wert 4. Da 4 kleiner als 5 ist, gilt links = 1 + 1 = 2
- 4mitte = 2, Wert 6. Da 6 größer als 5 ist, gilt rechts = 2 - 1 = 1
- 5Jetzt ist links = 2 größer als rechts = 1, der Suchbereich ist leer: Lücke 2. Nach 3 Vergleichen steht fest, dass 5 fehlt und an Index 2 eingefügt werden müsste
| Einträge n | Binäre Suche: höchstens | Lineare Suche: bis zu |
|---|---|---|
| 7 | 3 Vergleiche | 7 Vergleiche |
| 15 | 4 Vergleiche | 15 Vergleiche |
| 100 | 7 Vergleiche | 100 Vergleiche |
| 1000 | 10 Vergleiche | 1000 Vergleiche |
Teste dich
Alles auf einen Blick
Binäre Suche
Voraussetzung
Die Elemente sind sortiert, und man kann direkt auf das n-te Element zugreifen.
Mitte
mitte = links + (rechts - links) // 2 halbiert den Suchbereich.
Rand verschieben
Wert in der Mitte zu groß heißt rechts = mitte - 1, zu klein heißt links = mitte + 1.
Fehlender Wert
Ist der Suchbereich leer, ist der Wert nicht gefunden. Bei „Lücke x“ ist x der Einfügeindex.
Aufwand
Die Zeitkomplexität ist O(log n), denn der Suchbereich wird in jedem Schritt halbiert.
Musteraufgabe · Schritt für Schritt
Die Zahl 15 in einer Folge suchen
- 1Aufgabe (erfundene Daten): Suche 15 in [3, 5, 7, 9, 11, 13, 15, 17, 19] mit den Indizes 0 bis 8
- 2Start: links = 0, rechts = len(folge) - 1 = 8
- 3mitte = 0 + (8 - 0) // 2 = 4, Wert 11. Da 11 kleiner als 15 ist, gilt links = 4 + 1 = 5
- 4mitte = 5 + (8 - 5) // 2 = 5 + 1 = 6, Wert 15: gefunden
- 5Ergebnis: Position 6 nach 2 Vergleichen
Fehler finden
Prüfe die Schritte dieser Suche In einer Zeile steckt ein Fehler. Tippe sie an.
Fehler in Zeile 4Hier wird der falsche Rand verschoben. Richtig: Der Suchwert liegt in der rechten Hälfte, also gilt links = mitte + 1 = 4.
Lückentext
Wähl in jeder Lücke das passende Wort und prüf dann deine Antworten.
Die binäre Suche braucht Werte, die sind. Ist der Suchwert größer als der Wert in der Mitte, wird auf mitte + 1 gesetzt. Gilt links = 3 und rechts = 3, enthält der Suchbereich .
Karteikasten
Erst selbst überlegen, dann umdrehen.
Übung mit Feedback