Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Lineare und binäre Suche

Nach dieser Lektion: Ich kann die lineare und die binäre Suche vergleichen und die Schritte beider zählen.

Lektion, 55 Min.3 BefehleLab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Eine Million Einträge in zwanzig Schritten durchsuchen

Die binäre Suche findet einen Wert in einer sortierten Liste mit einer Million Einträgen in höchstens 20 Vergleichen. Die lineare Suche braucht im schlimmsten Fall eine Million.

Ein Rathaus sucht in einer Liste aller Postleitzahlen den passenden Ort. Wie viele Schritte das kostet, hängt von der Suchmethode ab, nicht vom Rechner.

Am Ende dieser Lektion

Notiz

Ich kann die lineare und die binäre Suche vergleichen und die Schritte beider zählen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Lineare Sucheein Element nach dem anderen prüfen
Binäre Suchedie Mitte prüfen und eine Hälfte verwerfen
Sortiertnach einer festen Reihenfolge geordnet3, 8, 15, 22
Schlimmster Falldie Eingabe, bei der ein Algorithmus am meisten Schritte braucht
Halbierendie Menge der Kandidaten auf die Hälfte verkleinern

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Lineare Suche prüft Wert für Wert

Die lineare Suche beginnt vorn und vergleicht jeden Wert mit dem Ziel. Sie hört auf, wenn sie das Ziel findet oder die Liste endet.

Im besten Fall steht das Ziel vorn und es ist ein Schritt. Im schlimmsten Fall steht es hinten oder fehlt, und es sind n Schritte. Die Liste muss dafür nicht sortiert sein.

Beide Suchen im Vergleich

Code: python
# Postleitzahlen, aufsteigend sortiert.
plz = [10115, 20095, 30159, 40213, 50667, 60311, 70173, 80331, 90402, 99084]
ziel = 80331

# Lineare Suche: von vorn, bis der Wert kommt.
schritte = 0
for i in range(len(plz)):
    schritte = schritte + 1
    if plz[i] == ziel:
        break
print("linear: Stelle", i, "nach", schritte, "Schritten")

# Binaere Suche: die Mitte pruefen, dann eine Haelfte wegwerfen.
unten = 0
oben = len(plz) - 1
schritte = 0
while unten <= oben:
    mitte = (unten + oben) // 2
    schritte = schritte + 1
    if plz[mitte] == ziel:
        print("binaer: Stelle", mitte, "nach", schritte, "Schritten")
        break
    elif plz[mitte] < ziel:
        unten = mitte + 1
    else:
        oben = mitte - 1
# Aendern Sie ziel auf 10115, dann auf 99084, dann auf 70000.

Binäre Suche halbiert in jedem Schritt

Die binäre Suche prüft den Wert in der Mitte. Ist das Ziel kleiner, kann es nur links stehen. Ist es größer, nur rechts.

So fällt in jedem Schritt die Hälfte der Kandidaten weg. Sie führt zwei Grenzen mit, unten und oben, und endet, wenn unten hinter oben liegt.

Eine Suche nach 70000, die nichts findet

RundeuntenobenMitteWert in der MitteEntscheidung
109450667zu klein: unten wird 5
259780331zu groß: oben wird 6
356560311zu klein: unten wird 6
466670173zu groß: oben wird 5
Ende65unten liegt hinter oben: nicht enthalten

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Schritte im schlimmsten Fall

Einträge nLineare SucheBinäre Suche
10104
1001007
1000100010
1.000.0001.000.00020

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die binäre Suche braucht eine sortierte Liste

Der Gedanke "links ist kleiner, rechts ist größer" stimmt nur in einer sortierten Liste. In einer ungeordneten Liste wirft die Suche die falsche Hälfte weg und übersieht Werte.

Sortiert hängt auch von der Ordnung ab. Als Text steht 100 vor 9, als Zahl dahinter. Die Befehle zeigen beide Ordnungen und eine lineare Suche in einer Datei.

Die falsche Hälfte wird weggeworfen

Code: python
# Die binaere Suche setzt eine sortierte Liste voraus.
zahlen = [40, 10, 30, 20, 50]
ziel = 10
unten = 0
oben = len(zahlen) - 1
gefunden = False
while unten <= oben:
    mitte = (unten + oben) // 2
    if zahlen[mitte] == ziel:
        gefunden = True
        break
    elif zahlen[mitte] < ziel:
        unten = mitte + 1
    else:
        oben = mitte - 1
print("gefunden:", gefunden)
# Die 10 steht in der Liste. Sortieren Sie die Liste von Hand und fuehren Sie erneut aus.

Zahlen als Text sortieren

Befehl
printf "10\n9\n100\n" | sort

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zahlen als Zahlen sortieren

Befehl
printf "10\n9\n100\n" | sort -n

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Lineare Suche nach der Zeile 640

Befehl
seq 1 1000 | grep -n -x 640

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, die binäre Suche sei immer besser. Sie setzt aber eine sortierte Liste voraus. Muss man erst sortieren und sucht nur einmal, ist die lineare Suche meist billiger. Die binäre Suche lohnt sich, wenn man oft in derselben sortierten Liste sucht.

Weiterführend

Wie viele Schritte braucht die binäre Suche höchstens bei 2000 Einträgen? Bei 4000? Schreiben Sie die Zahlen auf und erklären Sie das Muster.

Prüfen Sie Ihre Antwort mit python3 -c "print((2000).bit_length(), (4000).bit_length())" im Lab.

Über dieses Lab und seinen Quellcode: Lab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.