Praktische Informatik
Suchalgorithmen: linear, binär und über Streuspeicherung
Wie aus einer Million Vergleichen zwanzig werden und welche Voraussetzung man dafür bezahlen muss.
Benötigte Grundlagen
Dieses Vorwissen brauchst du für das Kapitel. Schau kurz nach, wenn dir etwas davon nicht mehr präsent ist, sonst leg direkt los.
Einführung
Suchen ist die häufigste Tätigkeit eines Programms. Jede Datenbankabfrage, jede Autovervollständigung, jeder Wörterbuchzugriff läuft darauf hinaus.
Bei einer Million Einträgen braucht das eine Verfahren im schlechtesten Fall eine Million Vergleiche, das zweite zwanzig und das dritte einen einzigen.
Der Unterschied ist gewaltig, aber nichts davon ist umsonst. Jedes schnellere Verfahren verlangt eine Voraussetzung, und der eigentliche Inhalt dieses Kapitels ist die Frage, welche das jeweils ist und was sie kostet.
Das kannst du nach diesem Kapitel
die lineare Suche beschreiben und ihren Aufwand angeben.
die binäre Suche durchführen und ihre Voraussetzung benennen.
begründen, warum die binäre Suche Schritte braucht.
abschätzen, ab wann sich vorheriges Sortieren lohnt.
das Prinzip der Streuspeicherung (Hashing) erläutern (Vertiefung).
Kurz aufgefrischt
Vorausgesetzt werden und aus Algorithmen entwerfen, die aus Aufwand von Algorithmen und das Feld aus Datentypen und Datenstrukturen.
Die lineare Suche
Der einfachste Weg: von vorn durchgehen und vergleichen.
Eingabe: Feld a mit n Elementen, gesuchter Wert x
für i von 0 bis n-1:
wenn a[i] = x:
gib i zurück
gib "nicht gefunden" zurück
| Fall | Vergleiche | Aufwand |
|---|---|---|
| bester | 1 (steht vorn) | |
| mittlerer | ||
| schlechtester | (hinten oder nicht da) |
Beachte, dass der mittlere Fall Vergleiche braucht und trotzdem in liegt: Der Faktor ist konstant und fällt weg.
Ihre große Stärke ist die fehlende Voraussetzung. Sie funktioniert auf unsortierten , auf Feldern wie auf , und sie braucht keinerlei Vorbereitung. Für kleine Datenmengen oder für eine einmalige Suche ist sie die richtige Wahl.
Lineare Suche: der schlechteste Fall
Das Feld ist unsortiert, und daraus folgt alles Weitere. Weil kein Wert etwas über seine Nachbarn verrät, bleibt nur: von vorn durchgehen und jeden vergleichen. Gesucht ist hier die 4. Sie steht ganz hinten, also werden alle sieben Zellen angesehen. Das ist der schlechteste Fall, und er tritt genauso ein, wenn der Wert gar nicht enthalten ist: Auch dann muss man bis zum Ende gehen, um das sagen zu können. Bei Elementen sind das Vergleiche, im Mittel . Beides ist , denn der Faktor ist konstant und fällt weg. 🔴 Und trotzdem ist das kein schlechtes Verfahren: Es setzt nichts voraus, keine Sortierung und keine Vorbereitung.
Die binäre Suche
Denk an ein Wörterbuch. Niemand fängt auf Seite 1 an. Man schlägt in der Mitte auf, schaut, ob das gesuchte Wort davor oder dahinter liegt, und halbiert so den Suchbereich.
Genau das ist die binäre Suche:
Eingabe: SORTIERTES Feld a, gesuchter Wert x
links = 0
rechts = n-1
solange links ≤ rechts:
mitte = (links + rechts) ganzzahlig geteilt durch 2
wenn a[mitte] = x:
gib mitte zurück
wenn a[mitte] < x:
links = mitte + 1 // rechte Hälfte weitersuchen
sonst:
rechts = mitte - 1 // linke Hälfte weitersuchen
gib "nicht gefunden" zurück
🔴 Die Voraussetzung ist die Sortierung, und sie ist nicht verhandelbar. Nur weil die sortiert sind, sagt ein einziger Vergleich, in welcher Hälfte der gesuchte Wert liegen kann. Auf unsortierten Daten liefert dieses Verfahren keine langsame Antwort, sondern eine falsche: Es meldet „nicht gefunden", obwohl der Wert vorhanden ist.
Warum ? Nach jedem Schritt ist höchstens die Hälfte übrig. Nach Schritten also Elemente, und man ist fertig, wenn eines übrig ist:
Die Zahlen dazu sind eindrucksvoll:
| lineare Suche | binäre Suche | |
|---|---|---|
| 100 | 100 | 7 |
| 10 000 | 10 000 | 14 |
| 1 000 000 | 1 000 000 | 20 |
| 1 000 000 000 | 30 |
Von einer Million auf eine Milliarde: Die lineare Suche wird tausendmal teurer, die binäre braucht zehn Schritte mehr. Das ist der Charakter des Logarithmus.
Binäre Suche: ein Vergleich, eine Hälfte
Dieselben sieben Zahlen, jetzt sortiert, und damit wird ein einziger Vergleich unverhältnismäßig wertvoll. Angesehen wird die Mitte, hier . Ist der gesuchte Wert kleiner, kann er nur links davon liegen; ist er größer, nur rechts. In beiden Fällen fallen mit einem Vergleich drei der sieben Zellen weg. Genau das ist der Unterschied zum Bild darüber: Dort sagt ein Vergleich nur etwas über eine Zelle, hier über die halbe Menge. 🔴 Die Sortierung ist deshalb keine Bequemlichkeit, sondern die Voraussetzung, ohne die der Schluss „dann liegt er links“ gar nicht zulässig wäre. Auf unsortierten liefert das Verfahren keine langsame Antwort, sondern eine falsche.
Die Suche nach der 12, Schritt für Schritt
Hier läuft das Verfahren aus dem Bild darüber wirklich ab, und die Spalte „Bereich“ ist die interessante: 7 Werte, dann 3, dann 1. Jeder Schritt halbiert. Daraus folgt der Aufwand, und zwar ohne Handwedeln: Nach Schritten sind noch Werte übrig, fertig ist man bei einem, also und . Rechne die Fußzeile nach, denn erst dort wird der Logarithmus greifbar: Von tausend auf eine Million wächst die Datenmenge um das Tausendfache, die Zahl der Schritte um zehn.
Was die Sortierung kostet
Die naheliegende Frage: Wenn die binäre Suche so viel besser ist, warum sortiert man nicht immer vorher?
Weil Sortieren kostet, also mehr als eine einzige lineare Suche mit .
Die Rechnung entscheidet nach der Anzahl der Suchvorgänge. Bei Suchen in :
| Vorgehen | Aufwand |
|---|---|
| -mal linear suchen | |
| einmal sortieren, dann -mal binär |
Für gewinnt die lineare Suche deutlich. Für großes gewinnt die Vorsortierung, denn dort steht gegen .
🔴 Daraus folgt die Faustregel: Einmal suchen heißt linear suchen. Oft suchen heißt einmal sortieren. Genau deshalb legen Datenbanken einen Index an: Er ist eine sortierte Struktur, die einmal aufgebaut und danach millionenfach benutzt wird.
Zwei Nebenbedingungen gehören dazu. Ändern sich die Daten laufend, muss die Sortierung mitgepflegt werden, und das kostet erneut. Und sortieren lässt sich nur, wo eine Ordnung besteht; auf Daten ohne sinnvolle Vergleichsordnung ist der Weg versperrt.
Vertiefung: Streuspeicherung
Dieser Abschnitt gehört zum erhöhten Anforderungsniveau.
Zwanzig Schritte sind gut. Geht auch einer?
Die Idee der Streuspeicherung (Hashing) ist verblüffend einfach: Man berechnet aus dem Wert selbst, wo er stehen soll.
Eine Streuwertfunktion bildet jeden Schlüssel auf einen Index ab:
Ein sehr einfaches Beispiel für Namen in einem Feld der Größe 26: liefert die Position des Anfangsbuchstabens.
Speichern: berechnen und dort ablegen. Suchen: berechnen und dort nachsehen.
Beides braucht eine Berechnung, also , unabhängig von der Datenmenge.
Das Problem sind Zusammenstöße. Zwei verschiedene Schlüssel können denselben Index liefern; „Anna" und „Anton" beginnen beide mit A. Man nennt das eine Kollision, und sie ist unvermeidlich: Es gibt mehr mögliche Schlüssel als Plätze, also müssen sich welche einen Platz teilen. Das ist wieder das Schubfachprinzip.
Zwei übliche Auswege:
- Verkettung: An jedem Index hängt eine aller Werte, die dorthin fallen.
- Sondieren: Bei Belegung wird der nächste freie Platz genommen.
Damit gilt nur im mittleren Fall. Landen alle Schlüssel auf demselben Index, entsteht eine einzige lange Liste, und die Suche fällt auf zurück. Entscheidend ist deshalb eine Streuwertfunktion, die gleichmäßig verteilt; der Anfangsbuchstabe wäre in der Praxis ungeeignet, weil manche Buchstaben viel häufiger vorkommen als andere.
Der Preis gegenüber der binären Suche: Eine Streuspeicherung kennt keine Ordnung. Fragen wie „alle Namen zwischen F und K" oder „der nächstgrößere Wert" lassen sich nicht beantworten, denn benachbarte Schlüssel landen an völlig unzusammenhängenden Stellen. Wer sortierte Ausgabe oder Bereichsabfragen braucht, ist mit einer sortierten Struktur besser bedient.
Streuspeicherung mit Verkettung
Die Regel oben ist die ganze Idee: Der Platz wird aus dem Schlüssel gerechnet, nicht gesucht. „Cem“ landet auf Platz 2, weil C der dritte Buchstabe ist, und beim Nachschlagen rechnet man dieselbe Zahl noch einmal aus und sieht direkt dort nach. Eine Rechnung, unabhängig davon, ob zehn oder zehn Millionen Schlüssel gespeichert sind: . 🔴 Und im selben Bild steht der Haken. „Anna“ und „Anton“ ergeben beide 0, also teilen sie sich einen Platz; das ist eine Kollision, und sie ist unvermeidlich, weil es mehr mögliche Schlüssel als Plätze gibt, dasselbe Schubfachprinzip wie bei den nichtregulären Sprachen. Hier hängen die beiden als Kette aneinander, und wer sie sucht, muss die Kette durchgehen. Landen alle Schlüssel auf demselben Platz, ist aus wieder geworden. Deshalb zählt eine Streuwertfunktion, die gleichmäßig verteilt, der Anfangsbuchstabe tut das gerade nicht. Die beiden leeren Plätze sind übrigens kein Versehen, sondern der Preis: Eine Tabelle ohne Luft kollidiert ständig.
Die drei im Vergleich
| Verfahren | Aufwand | Voraussetzung | Ordnung nutzbar |
|---|---|---|---|
| linear | keine | – | |
| binär | sortiert | ja | |
| Streuspeicherung | im Mittel | gute Streuwertfunktion | nein |
Das ist der eigentliche Ertrag des Kapitels: Geschwindigkeit wird mit Voraussetzungen bezahlt. Es gibt kein Verfahren, das schneller ist und nichts verlangt.
Binäre Suche Schritt für Schritt
Suche die 23 im sortierten Feld mit den Indizes 0 bis 9.
- 1
Start: , .
- 2
Schritt 1: (ganzzahlig). Dort steht 16. Es gilt , also liegt 23 rechts davon: .
- 3
Noch im Spiel sind die Indizes 5 bis 9, also fünf statt zehn Elemente.
- 4
Schritt 2: . Dort steht 56. Es gilt , also links weitersuchen: .
- 5
Schritt 3: . Dort steht 23. Gefunden an Index 5.
- 6
Bilanz: drei Vergleiche statt sechs bei der linearen Suche. Bei zehn Elementen ist der Unterschied klein. Die Rechnung passt dazu, und bei einer Million wären es 20 statt einer Million.
- 7
Gegenprobe mit einem nicht vorhandenen Wert, etwa 40: Der Bereich schrumpft, bis wird. Die Schleifenbedingung ist dann verletzt, und das Verfahren meldet zu Recht „nicht gefunden". Genau dieser Abbruch ist der Grund für die Bedingung .
23 steht an Index 5, gefunden in drei Schritten. Der Suchbereich schrumpfte von 10 über 5 auf 2 Elemente.
Lohnt sich das Sortieren?
Ein Feld hat Einträge. Fall A: Es wird einmal gesucht. Fall B: Es wird 10 000-mal gesucht. Was ist jeweils günstiger?
- 1
Die drei Größen aufschreiben:
Lineare Suche: Schritte je Suche. Sortieren: Schritte, einmalig. Binäre Suche: Schritte je Suche.
- 2
Fall A, eine Suche. Linear: . Sortieren und binär: .
- 3
Die Vorsortierung ist hier etwa zwanzigmal teurer. Für eine einzige Suche lohnt sie sich eindeutig nicht.
- 4
Fall B, 10 000 Suchen. Linear: . Sortieren und binär: .
- 5
Jetzt ist die Vorsortierung etwa 500-mal billiger. Bemerkenswert: Die 10 000 Suchen kosten zusammen nur ein Hundertstel des Sortierens; nach dem Sortieren fällt der Suchaufwand praktisch nicht mehr ins Gewicht.
- 6
Die Grenze bestimmen: Gleichsetzen von und ergibt hier etwa . Ab ungefähr zwanzig Suchvorgängen lohnt das Sortieren also bereits. Genau deshalb legen Datenbanken einen Index an, sobald eine Spalte regelmäßig durchsucht wird.
Fall A: linear suchen, die Vorsortierung wäre zwanzigmal teurer. Fall B: sortieren, das ist etwa 500-mal billiger. Die Grenze liegt bei rund 20 Suchvorgängen.
Typischer Fehler
„Die binäre Suche ist immer besser, also nimmt man sie überall."
Sie ist nur unter einer Bedingung besser, und ohne diese Bedingung ist sie nicht langsamer, sondern falsch.
Nimm das unsortierte Feld und suche die 5. Die binäre Suche prüft die Mitte, findet dort 91, folgert und sucht nur noch links. Die 5 steht an Index 1, liegt also tatsächlich links, aber im nächsten Schritt trifft sie auf 38, folgert wieder „links" und landet bei 38 allein. Das Verfahren meldet „nicht gefunden", obwohl die 5 im Feld steht.
Das ist der gefährlichste Fehlertyp überhaupt: Das Programm stürzt nicht ab und meldet keinen Fehler, sondern liefert ein plausibel aussehendes falsches Ergebnis.
Zwei weitere Fälle, in denen die lineare Suche vorzuziehen ist:
Kleine Datenmengen. Bei zehn Elementen sind es 10 gegen 3 Vergleiche; der Unterschied ist bedeutungslos, und die lineare Suche ist kürzer und weniger fehleranfällig zu schreiben.
Einmalige Suche in unsortierten . Das Sortieren kostet und damit mehr als die eine lineare Suche mit .
Die richtige Frage lautet also nicht „welches Verfahren ist schneller?", sondern „sind die Daten sortiert, und wie oft wird gesucht?".
Übung 1
leichta) Wie viele Vergleiche braucht die lineare Suche im schlechtesten Fall bei ? b) Wie viele braucht die binäre Suche bei ? c) Welche Voraussetzung hat die binäre Suche?
Tipp anzeigen
Zu b): Wie oft lässt sich 1024 halbieren?
Lösung anzeigen
a) 500 Vergleiche. Der schlechteste Fall ist erreicht, wenn der Wert ganz hinten steht oder gar nicht vorhanden ist.
b) , denn . Zehn Halbierungen führen von 1024 auf ein Element.
c) Die müssen sortiert sein. Nur dann sagt der Vergleich mit dem mittleren Element, in welcher Hälfte der gesuchte Wert liegen kann. Auf unsortierten Daten liefert das Verfahren falsche Ergebnisse, keine langsamen.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
a) Der schlechteste Fall der linearen Suche
500 Vergleiche. Der schlechteste Fall ist erreicht, wenn der Wert ganz hinten steht oder gar nicht vorhanden ist, in beiden Fällen muss jedes Element angesehen werden.
Zwischenergebnis
500 Vergleiche.
- 2
b) Die binäre Suche bei 1024: wie oft lässt sich halbieren?
, denn . Zehn Halbierungen führen von 1024 auf ein Element: .
, also
Zwischenergebnis
10 Vergleiche.
- 3
c) Die Voraussetzung, und was ohne sie passiert
Die Daten müssen sortiert sein. Nur dann sagt der Vergleich mit dem mittleren Element, in welcher Hälfte der gesuchte Wert liegen kann. Wichtig: Auf unsortierten Daten liefert das Verfahren falsche Ergebnisse, keine langsamen.
Übung 2
mittelGegeben ist das sortierte Feld mit den Indizes 0 bis 10.
a) Suche die 44 binär. Schreibe alle Schritte mit links, rechts und mitte auf. b) Suche die 20. Wie erkennt das Verfahren, dass sie fehlt? c) Wie viele Vergleiche hätte die lineare Suche jeweils gebraucht? d) Ein Programm sucht 5-mal in 1000 unsortierten Datensätzen. Lohnt sich Sortieren?
Tipp anzeigen
Zu a): wird abgerundet.
Lösung anzeigen
a) Ablauf:
| Schritt | links | rechts | mitte | a[mitte] | Vergleich | Folge |
|---|---|---|---|---|---|---|
| 1 | 0 | 10 | 5 | 31 | links = 6 | |
| 2 | 6 | 10 | 8 | 60 | rechts = 7 | |
| 3 | 6 | 7 | 6 | 44 | gefunden | Index 6 |
Drei Vergleiche.
b) Ablauf:
| Schritt | links | rechts | mitte | a[mitte] | Vergleich | Folge |
|---|---|---|---|---|---|---|
| 1 | 0 | 10 | 5 | 31 | rechts = 4 | |
| 2 | 0 | 4 | 2 | 11 | links = 3 | |
| 3 | 3 | 4 | 3 | 18 | links = 4 | |
| 4 | 4 | 4 | 4 | 25 | rechts = 3 |
Jetzt ist , die Schleifenbedingung ist verletzt. Das Verfahren meldet „nicht gefunden". Der leere Bereich ist also das Erkennungsmerkmal: Es gibt keine Stelle mehr, an der die 20 stehen könnte.
c) Für die 44 an Index 6: sieben Vergleiche (Indizes 0 bis 6). Für die fehlende 20: elf Vergleiche, also das ganze Feld.
d) Nein. Fünf lineare Suchen kosten Vergleiche. Sortieren kostet etwa Schritte, dazu noch für die Suchen. Die Vorsortierung ist damit etwa doppelt so teuer.
Die Grenze liegt hier bei ungefähr Suchvorgängen. Ab etwa zehn Suchen lohnt sich das Sortieren, bei fünf noch nicht.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
Teil a): Tabelle führen statt im Kopf rechnen
Man legt eine Tabelle mit links, rechts, mitte und dem Wert an und füllt sie Zeile für Zeile. wird abgerundet.
\texttt{mitte} = (0+10) : 2 = 5
Zwischenergebnis
Erster Vergleich mit .
Nach jedem Vergleich wandert genau eine Grenze, und zwar um eins über die Mitte hinaus. So kann die schon geprüfte Mitte nicht noch einmal drankommen.
- 2
Teil b): Wie ein Fehlschlag aussieht
Man rechnet weiter, bis der Bereich leer wird. Das passiert, wenn größer als wird.
Zwischenergebnis
Nach vier Schritten .
- 3
Teil c): Den Vergleich ehrlich ziehen
Man zählt bei der linearen Suche bis zur Fundstelle, beim Fehlschlag durch das ganze Feld. Bei nur elf Elementen ist der Unterschied gering, aber er wächst mit .
7 \text{ gegen } 3 \qquad 11 \text{ gegen } 4
Zwischenergebnis
Binär gewinnt schon hier, aber unspektakulär.
Genau deshalb lohnt sich bei kleinen Feldern die lineare Suche: Der Vorteil ist gering, der Aufwand beim Schreiben und die Fehleranfälligkeit dagegen höher.
- 4
Teil d): Die Grenze ausrechnen, nicht schätzen
Man stellt beide Gesamtaufwände einander gegenüber und vergleicht die Zahlen. Erst dann steht die Antwort fest.
5 \cdot 1000 = 5000 \quad \text{gegen} \quad 10,000 + 50
Zwischenergebnis
Sortieren lohnt sich hier nicht.
Übung 3
schwera) Begründe rechnerisch, warum die binäre Suche Schritte braucht. b) Zeige an einem eigenen Beispiel, dass die binäre Suche auf unsortierten ein falsches Ergebnis liefern kann. c) (Vertiefung) Erkläre das Prinzip der Streuspeicherung und warum Kollisionen unvermeidlich sind. d) (Vertiefung) Nenne einen Fall, in dem eine sortierte Struktur der Streuspeicherung überlegen ist, obwohl diese schneller sucht.
Tipp anzeigen
Zu c): Wie viele mögliche Schlüssel gibt es, wie viele Plätze?
Lösung anzeigen
a) Nach jedem Schritt ist höchstens die Hälfte des Bereichs übrig. Nach Schritten sind es also Elemente. Das Verfahren endet, wenn nur noch eines übrig ist:
Anschaulich: Jede Verdopplung der Datenmenge kostet genau einen zusätzlichen Schritt, denn eine Halbierung mehr genügt, um wieder bei einem Element anzukommen.
b) Feld , gesucht wird die 2 an Index 1.
Schritt 1: , dort steht 7. Es gilt , also sucht das Verfahren links weiter: . Schritt 2: , dort steht 9. Es gilt , also . Jetzt ist , und das Verfahren meldet „nicht gefunden", obwohl die 2 im Feld steht.
Das Programm stürzt nicht ab und meldet keinen Fehler; es liefert schlicht ein falsches Ergebnis. Genau das macht diesen Fehlertyp so gefährlich.
c) Eine Streuwertfunktion berechnet aus dem Schlüssel unmittelbar den Speicherplatz: . Gespeichert und gesucht wird an genau diesem Platz, weshalb beides nur eine Berechnung kostet, also im Mittel.
Kollisionen sind unvermeidlich, weil es mehr mögliche Schlüssel als Plätze gibt. Bei einer Tabelle mit 1000 Plätzen und beliebig langen Namen als Schlüsseln müssen zwangsläufig verschiedene Namen auf denselben Index abgebildet werden; das ist genau das Schubfachprinzip. Behandelt werden sie durch Verkettung (an jedem Platz hängt eine Liste) oder Sondieren (der nächste freie Platz wird genommen). Deshalb gilt nur im mittleren Fall: Fallen alle Schlüssel auf denselben Index, entsteht eine einzige lange Liste und die Suche wird wieder .
d) Immer dann, wenn die Ordnung gebraucht wird. Beispiele:
- „Alle Kundennummern zwischen 1000 und 2000", eine Bereichsabfrage.
- „Der nächstgrößere vorhandene Wert", etwa bei einer Terminsuche.
- „Gib alle Einträge sortiert aus."
Eine Streuspeicherung kann das nicht, weil sie die Schlüssel absichtlich über die Tabelle verstreut; benachbarte Schlüssel landen an unzusammenhängenden Stellen, und die Struktur weiß nichts über „größer" oder „kleiner". Bei einer sortierten Struktur ist eine Bereichsabfrage dagegen sehr billig: Man sucht die untere Grenze binär und liest von dort der Reihe nach weiter.
Das ist ein gutes Beispiel für die Kernaussage des Kapitels: Die Streuspeicherung erkauft ihre Geschwindigkeit damit, dass sie eine Eigenschaft der Daten aufgibt.
Detaillierte Schritterklärung anzeigen
Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.
✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.
- 1
a) Die Schrittzahl der binären Suche herleiten
Nach jedem Schritt ist höchstens die Hälfte des Bereichs übrig, nach Schritten also Elemente. Das Verfahren endet, wenn nur noch eines übrig ist: .
- 2
b) Ein Gegenbeispiel für das falsche Ergebnis auf unsortierten Daten
Feld , gesucht die 2 an Index 1. Schritt 1: , dort steht 7; wegen sucht das Verfahren links weiter (). Schritt 2: , dort steht 9; wegen wird . Jetzt ist , das Verfahren meldet „nicht gefunden“, obwohl die 2 im Feld steht.
: mitte 7 → links; mitte 9 → links; links rechts → nicht gefunden
- 3
c) (Vertiefung) Streuspeicherung und die Unvermeidbarkeit von Kollisionen
Eine Streuwertfunktion berechnet aus dem Schlüssel unmittelbar den Speicherplatz: . Gespeichert und gesucht wird an genau diesem Platz, weshalb beides nur eine Berechnung kostet, also im Mittel.
- 4
d) (Vertiefung) Wo eine sortierte Struktur überlegen ist
Immer dann, wenn die Ordnung gebraucht wird: „Alle Kundennummern zwischen 1000 und 2000“ (Bereichsabfrage), „der nächstgrößere vorhandene Wert“ (etwa bei einer Terminsuche), „gib alle Einträge sortiert aus“. Eine Streuspeicherung kann das nicht, weil sie die Schlüssel absichtlich über die Tabelle verstreut.
Zusammenfassung
Die lineare Suche geht die von vorn durch und braucht im schlechtesten Fall Vergleiche; ihr Vorteil ist, dass sie überhaupt keine Voraussetzung stellt und deshalb immer funktioniert. Die binäre Suche halbiert in jedem Schritt den Bereich und kommt mit Vergleichen aus, weil nach Schritten nur noch Elemente übrig sind; sie setzt aber sortierte Daten voraus und liefert ohne diese Sortierung nicht ein langsames, sondern ein falsches Ergebnis. Da Sortieren selbst kostet, lohnt es sich erst ab etwa Suchvorgängen, weshalb Datenbanken für regelmäßig durchsuchte Spalten einen Index anlegen, ihn aber nicht für jede einmalige Abfrage aufbauen. Die Streuspeicherung berechnet den Speicherplatz direkt aus dem Schlüssel und erreicht damit im Mittel , muss dafür aber Kollisionen behandeln, die nach dem Schubfachprinzip unvermeidlich sind, und gibt jede Ordnung der Daten auf. Damit zeigt sich der rote Faden des Kapitels: Jede Steigerung der Geschwindigkeit wird mit einer zusätzlichen Voraussetzung oder einer aufgegebenen Eigenschaft bezahlt.


