Eine Datenstruktur wählen
Unter 1023 Schlüsseln macht eine lineare Suche nach einem fehlenden Schlüssel 1023 Vergleiche, die binäre Suche 10, und eine Hashtabelle mit 1023 Buckets kam im Labor mit höchstens 6 aus.
Bei den Fragen anfangen, die du stellen wirst
Keine Struktur ist in allem die beste. Jede macht manche Operationen billig, indem sie andere teuer macht. Wählen kannst du also, indem du auflistest, was dein Programm am häufigsten tun wird. MIT 6.006 teilt die Möglichkeiten in zwei Schnittstellen. Eine Sequenz hält Elemente in einer Reihenfolge, die du festlegst (erstes, zweites, drittes), und du fragst Elemente nach ihrer Position ab. Eine Menge (Set) hält Elemente nach Schlüssel, und du fragst, ob ein Schlüssel da ist, nach dem kleinsten Schlüssel oder nach dem nächsten nach einem bestimmten Schlüssel. Eine Menge ohne die Ordnungsfragen heißt Wörterbuch (Dictionary).
Ein paar häufige Situationen und die übliche Antwort:
- Elemente nach Position lesen, am Ende anfügen: ein dynamisches Array (ein JavaScript-Array).
- Rückgängig-Verlauf, passende Klammern, Tiefensuche: ein Stapel, also ein Array, das nur am Ende benutzt wird.
- Aufträge in der Reihenfolge des Eintreffens, Breitensuche: eine Warteschlange, mit head-Index oder Ringpuffer statt shift auf einem langen Array.
- Dinge nach Name oder ID nachschlagen: eine Hashtabelle, in JavaScript also Map oder Set.
- Schlüssel beim Einfügen und Löschen sortiert halten, nach dem nächsten Schlüssel fragen: ein ausgeglichener binärer Suchbaum.
- Viele Einfügungen und Löschungen an einer Stelle, die du schon hast: eine verkettete Liste.
Dieselbe Suche in fünf Strukturen
Das Labor unten speichert dieselben Schlüssel auf fünf Arten und zählt die Vergleiche, die nötig sind, um einen davon zu finden. Die Schlüssel sind 15, 127 oder 1023 zufällige ganze Zahlen. Das unsortierte Array nutzt die lineare Suche. Das sortierte Array nutzt die binäre Suche. Der ausgeglichene Baum wurde gebaut, indem zuerst die mittleren Schlüssel eingefügt wurden, er ist also so niedrig wie möglich. Der andere Baum wurde aus den sortierten Schlüsseln gebaut und ist daher eine Kette. Die Hashtabelle hat so viele Buckets wie Schlüssel und zählt 1 für die Berechnung von h(k).
Zum Drehen ziehen. Zum Zoomen scrollen oder mit zwei Fingern ziehen.
Bei 15 Schlüsseln sind die Unterschiede klein: Die lineare Suche braucht im Mittel 8 Vergleiche, die binäre Suche etwa 3.3. Bei 1023 Schlüsseln nicht mehr. Die lineare Suche braucht im Mittel 512 und für einen fehlenden Schlüssel 1023, während die binäre Suche und der ausgeglichene Baum nie mehr als 10 brauchen. Der Ketten-Baum ist so schlecht wie die lineare Suche. Die Hashtabelle bleibt bei jeder Größe im Mittel zwischen 2.3 und 2.5, weil ihre Ketten kurz bleiben, und in diesem Labor lag ihr schlechtester Fall bei 1023 Schlüsseln bei 6. Deshalb ist Map die Standardwahl zum Nachschlagen, und deshalb lohnen sich sortierte Strukturen nur, wenn du auch die Ordnung brauchst.
| Nach Position | Element i holen | Vorn einfügen oder löschen |
|---|---|---|
| Dynamisches Array | 1 | n |
| Verkettete Liste | n | 1 |
| Sortiertes Array | 1 | n |
| Nach Schlüssel | Finden | Einfügen | Nächster Schlüssel |
|---|---|---|---|
| Array oder Liste | n | n | n |
| Sortiertes Array | log n | n | log n |
| Hashtabelle | 1 im Mittel | 1 im Mittel | n |
| Ausgeglichener BST | log n | log n | log n |
Jede Zelle dieser beiden Tabellen ist die Wachstumsrate der Kosten bei n Elementen, nach den Tabellen in den MIT-Vorlesungsunterlagen 2, 4 und 7. Hashtabellen und Suchbäume stehen nur in der zweiten Tabelle, weil sie nach Schlüssel arbeiten, nicht nach Position. In einem unsortierten Array oder einer Liste kostet das Einfügen eines Schlüssels n, weil man erst prüfen muss, dass er nicht schon da ist. Das sortierte Array findet schnell, muss aber Werte verschieben, um Platz für einen neuen Schlüssel zu machen.
Map oder Objekt?
JavaScript-Programme verwenden oft ein normales Objekt als Wörterbuch und schreiben prices["apple"]. MDN nennt Gründe, Map vorzuziehen, wenn die Schlüssel aus Daten stammen: Ein Objekt hat einen Prototyp und enthält daher Standardschlüssel, die mit deinen kollidieren könnten. Eine Map kann jeden Wert als Schlüssel nehmen, nicht nur Strings und Symbole. Ihre Größe ist eine einzige Eigenschaft, map.size. Und sie wird in Einfügereihenfolge durchlaufen. Für Datensätze mit einer festen Menge benannter Felder bleiben Objekte die natürliche Wahl.
- 1953: H. P. Luhns IBM-Memorandum schlägt Hashing in Buckets mit Verkettung vor.
- Um 1956: IPL von Newell, Shaw und Simon bringt verkettete Listen.
- 1957: Bauer und Samelson melden ein Patent auf das Stapelverfahren an; Fortran erscheint mit Arrays.
- 1962: Adelson-Velski und Landis veröffentlichen den AVL-Baum, den ersten ausgeglichenen Suchbaum.
- 2015: ECMAScript 2015 bringt Map und Set in JavaScript.
- Wie viele Vergleiche macht eine lineare Suche nach einem fehlenden Schlüssel unter 1023 Schlüsseln?
- Wie viele Vergleiche macht die binäre Suche unter 1023 sortierten Schlüsseln höchstens?
- Lineare Suche über 15 Schlüssel: Wie viele Vergleiche sind es im Durchschnitt über alle 15 Schlüssel?
- Ein BST aus 127 sortiert eingefügten Schlüsseln: Wie viele Vergleiche für den größten Schlüssel?
- Ein Texteditor braucht „Rückgängig“. Welche Struktur passt?
- Warteschlange
- Stapel
- Hashtabelle
- Sortiertes Array
- Ein Druckserver muss Aufträge in der Reihenfolge ihres Eintreffens abarbeiten. Welche Struktur passt?
- Warteschlange
- Stapel
- BST
- Verkettete Liste als Stapel benutzt
- Du musst einen Nutzerdatensatz viele Male pro Sekunde über seine ID nachschlagen. Was nimmt man in JavaScript üblicherweise?
- Ein Array, das mit einer Schleife durchsucht wird
- Eine Map mit der ID als Schlüssel
- Einen Stapel
- Eine verkettete Liste
- Die Schlüssel sollen beim Einfügen und Löschen sortiert bleiben, und du fragst oft nach dem nächstgrößeren Schlüssel. Was passt am besten?
- Hashtabelle
- Ausgeglichener BST
- Warteschlange
- Unsortiertes Array
- Wie heißt in den Begriffen von MIT 6.006 eine Menge ohne die Ordnungsoperationen?
- eine Sequenz
- ein Wörterbuch (Dictionary)
- ein Stapel
- eine Warteschlange
- Warum kann ein normales Objekt laut MDN als Wörterbuch für Schlüssel aus Daten riskant sein?
- Objekte können keine Strings enthalten
- Sein Prototyp bringt Standardschlüssel mit, die mit deinen kollidieren können
- Objekte sind immer langsamer als Arrays
- Objekte vergessen Werte nach einer Sekunde
- Nach den Operationen wählen, die du am häufigsten ausführst.
- Sequenz: Array, verkettete Liste, Stapel, Warteschlange. Menge: Hashtabelle, BST.
- Bei 1023 Schlüsseln: lineare Suche bis zu 1023 Vergleiche, binäre Suche und ausgeglichener Baum bis zu 10.
- Map ist das übliche Wörterbuch in JavaScript; einen ausgeglichenen Baum nehmen, wenn du auch die Ordnung brauchst.
Quellen zu diesem Kurs (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 2 Data Structures (interface vs data structure, Sequence and Set interfaces, stack = insert_last/delete_last, queue = insert_last/delete_first, array, linked list, dynamic array, amortized Θ(1) append)
- 4 Hashing (chaining, pigeonhole collisions, chain length n/m)
- 6 Binary Trees Part 1 (height, traversal order, O(h) operations) and 7 Binary Trees Part 2: AVL (Adelson-Velsky and Landis, 1962) at ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes
- MDN Web Docs, Array.prototype.shift (shifts all values left by 1)
- Array.prototype.unshift, Map (insertion order, Map vs Object, spec requires sublinear average access) and Set (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)
- ECMAScript 2025 Language Specification (tc39.es/ecma262)
- 24.1 Map Objects and 24.2 Set Objects ("must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements")
- Array.prototype.shift steps (Repeat, while k < len: move element k to k - 1)
- D. E. Knuth, The Art of Computer Programming vol. 3 (2nd ed. 1998) section 6.4 History (H. P. Luhn, IBM internal memorandum January 1953, hashing with chaining; digit pairs added mod 10, 31415926 -> 4548) via gwern.net copy, and IEEE Spectrum, "Hans Peter Luhn and the Birth of the Hashing Algorithm" (2018)
- "A brief history of the stack", SIGCIS (sigcis.org/files/A brief history.pdf: Bauer and Samelson applied for the patent in 1957, US 3,047,228 granted July 31, 1962; IPL list processing by Newell, Simon and Shaw at RAND 1956) and Wikipedia, Information Processing Language (Newell, Shaw, Simon, RAND and Carnegie Institute of Technology, about 1956).
Abgerufen: 2026-10-18