Kostenlose Multiple-Choice-Übungsfragen zu Datenstrukturen mit Tipps und Erklärungen, in drei Stufen: Begriffe und Fakten, Konzepte anwenden, Fälle und Analyse.
Eine Datenstruktur ist eine Art, Daten im Speicher so zu organisieren, dass bestimmte Operationen schnell sind: ein Element finden, eines hinzufügen, eines entfernen.
Keine Struktur ist bei allem schnell. Eine Struktur zu wählen heißt zu wählen, welche Operationen günstig sein sollen. Ihre Kosten werden in Big O angegeben, wobei n die Anzahl der Elemente ist.
Die beiden grundlegenden Bausteine sind das Array und die verkettete Liste.
Ein Array speichert seine Elemente in einem Speicherblock, eines nach dem anderen. Der Computer kann berechnen, wo Element i liegt, daher kostet das Lesen von a[i] O(1). Das Einfügen am Anfang erfordert das Verschieben jedes Elements: O(n).
Eine verkettete Liste speichert jedes Element in einem Knoten mit einem Zeiger auf den nächsten Knoten. Der letzte Zeiger ist null. Das Einfügen am Kopf (h) ändert nur einen Zeiger: O(1). Um aber Element i zu erreichen, musst du i Zeigern folgen: O(n).
Eine doppelt verkettete Liste hat zusätzlich einen Zeiger auf den vorherigen Knoten, sodass du in beide Richtungen laufen kannst.
Selbsttest Welche Operation ist bei einem Array O(1), bei einer einfach verketteten Liste aber O(n)?
Das Element an Index i lesen
Die Elemente einzeln zählen
Ein neues Element am Anfang einfügen
Jedes Element einmal besuchen
Antwort: Das Element an Index i lesen. Ein Array berechnet die Adresse von Element i direkt. Eine verkettete Liste muss i Zeigern vom Kopf aus folgen. Das Einfügen am Anfang ist der umgekehrte Fall: günstig für eine Liste, teuer für ein Array.
2Stapel und Warteschlangen
Ein Stapel (stack) ist wie ein Stapel Teller: Du legst nur oben auf und nimmst nur oben weg. Das zuletzt hineingelegte Element kommt als erstes wieder heraus: LIFO.
push legt ein Element oben auf, pop entfernt das oberste Element, peek liest das oberste, ohne es zu entfernen. Alle kosten O(1).
Verwendung: die Rückgängig-Funktion eines Editors, der Aufrufstapel eines Programms, die Prüfung, ob Klammern ausgeglichen sind, Tiefensuche.
Eine Warteschlange (queue) ist wie eine Schlange an der Kasse: Du stellst dich hinten an und gehst vorne weg. Das zuerst hineingekommene Element kommt als erstes wieder heraus: FIFO.
enqueue fügt hinten hinzu, dequeue entfernt vorne. Beide kosten O(1).
Eine Deque (doppelseitige Warteschlange) erlaubt Hinzufügen und Entfernen an beiden Enden. Eine Prioritätswarteschlange entfernt immer zuerst das Element mit der höchsten Priorität; sie wird meist als Heap gebaut.
Selbsttest Welche Datenstruktur passt am besten zur „Rückgängig“-Schaltfläche eines Texteditors?
Ein Graph
Ein Stapel
Eine Hashtabelle
Eine Warteschlange
Antwort: Ein Stapel. Rückgängig muss die jüngste Aktion zuerst zurücknehmen: zuletzt hinein, zuerst heraus. Eine Warteschlange würde die älteste Aktion zuerst rückgängig machen.
3Bäume, Heaps, Hashtabellen und Graphen
Ein Baum hat einen obersten Knoten, die Wurzel. Jeder andere Knoten hat genau einen Elternknoten. Knoten ohne Kinder sind Blätter. Ein Baum mit n Knoten hat n − 1 Kanten.
In einem Binärbaum hat jeder Knoten höchstens zwei Kinder. Ein binärer Suchbaum (BST) fügt eine Regel hinzu: Schlüssel im linken Teilbaum sind kleiner als der Knoten, Schlüssel im rechten Teilbaum sind größer.
Das Suchen in einem BST folgt einem Pfad nach unten und kostet daher O(Höhe). Ein ausgeglichener Baum (AVL, Rot-Schwarz) hält die Höhe nahe log₂ n. Schlüssel, die in sortierter Reihenfolge eingefügt werden, ergeben eine Kette der Höhe n.
Ein Heap ist ein Binärbaum, in dem jeder Elternknoten kleiner als seine Kinder (Min-Heap) oder größer (Max-Heap) ist. Das Minimum oder Maximum liegt an der Wurzel, und Einfügen und Entfernen kosten O(log n).
Eine Hashtabelle speichert Schlüssel-Wert-Paare. Eine Hashfunktion macht aus dem Schlüssel einen Index, sodass Einfügen und Nachschlagen im Mittel O(1) kosten. Zwei Schlüssel mit demselben Index sind eine Kollision, die durch Verkettung (eine Liste pro Platz) oder offene Adressierung (einen anderen Platz probieren) gelöst wird.
Ein Graph hat Knoten, die durch Kanten verbunden sind, welche eine Richtung oder ein Gewicht haben können. Er wird als Adjazenzmatrix mit O(V²) Speicher oder als Adjazenzlisten mit O(V + E) gespeichert.
Selbsttest Die Schlüssel 50, 30, 70, 20 und 40 werden in dieser Reihenfolge in einen leeren binären Suchbaum eingefügt. Was ist das linke Kind von 30?
20
40
70
Es hat kein linkes Kind
Antwort: 20. 20 ist kleiner als 50, geht also nach links zu 30. Es ist auch kleiner als 30, geht also wieder nach links. 40 ist größer als 30 und wird sein rechtes Kind.
4Das Verfahren Schritt für Schritt
Fragen beschreiben oft eine Aufgabe und fragen, welche Struktur passt, oder fragen, wie eine Struktur nach einigen Operationen aussieht.
Finde die Operation, die schnell sein muss: Zugriff über die Position, über den Schlüssel, das neueste Element, das älteste Element, das kleinste Element oder ein Bereich.
Ordne ihr eine Struktur zu: Index → Array, Schlüssel → Hashtabelle, neuestes → Stapel, ältestes → Warteschlange, kleinstes oder größtes → Heap, sortierte Reihenfolge oder Bereiche → ausgeglichener Suchbaum.
Prüfe die Kosten der anderen Operationen, die die Aufgabe braucht, in Big O.
Führe bei einer Ablaufaufgabe die Operationen eine nach der anderen aus und schreibe den Zustand nach jeder auf.
Prüfe den Endzustand an der Regel der Struktur: LIFO, FIFO, die BST-Ordnung oder die Heap-Ordnung.
5Ein durchgerechnetes Beispiel
Folge jedem Schritt. Versuche, den nächsten vorherzusagen, bevor du ihn öffnest.
Durchgerechnetes Beispiel
Die Schlüssel 50, 30, 70, 20, 40 und 60 werden in dieser Reihenfolge in einen leeren binären Suchbaum eingefügt. Wie lautet die Inorder-Traversierung, und wie viele Vergleiche braucht die Suche nach 60?
1
Die Wurzel einfügen
Der erste Schlüssel, 50, wird zur Wurzel.
2
30 und 70 einfügen
30 ist kleiner als 50, geht also nach links. 70 ist größer als 50, geht also nach rechts.
3
20, 40 und 60 einfügen
20: kleiner als 50, kleiner als 30, also links von 30. 40: kleiner als 50, größer als 30, also rechts von 30. 60: größer als 50, kleiner als 70, also links von 70.
4
In Inorder-Reihenfolge durchlaufen
Eine Inorder-Traversierung besucht den linken Teilbaum, dann den Knoten, dann den rechten Teilbaum.
Das ergibt 20, 30, 40, 50, 60, 70: die Schlüssel in sortierter Reihenfolge, wie es bei einem BST immer ist.
5
Nach 60 suchen
Mit 50 vergleichen: größer, nach rechts. Mit 70 vergleichen: kleiner, nach links. Mit 60 vergleichen: gefunden.
Die Suche braucht 3 Vergleiche, einen pro Ebene.
Antwort
Inorder: 20, 30, 40, 50, 60, 70. Die Suche nach 60 braucht 3 Vergleiche.
6Häufige Fehler
LIFO und FIFO verwechseln. Ein Stapel gibt das neueste Element zurück, eine Warteschlange das älteste.
Denken, eine verkettete Liste erlaube schnellen Zugriff über den Index. Sie muss vom Kopf aus laufen.
Annehmen, ein BST sei immer O(log n). Nur ein ausgeglichener Baum ist es; sortiertes Einfügen ergibt O(n).
Kollisionen in einer Hashtabelle vergessen. O(1) ist der Mittelwert, nicht der schlechteste Fall.
Die Traversierungen verwechseln. Preorder: Knoten zuerst. Inorder: Knoten in der Mitte. Postorder: Knoten zuletzt.
Eine Adjazenzmatrix für einen großen dünn besetzten Graphen verwenden. Sie verschwendet O(V²) Speicher.
Selbsttest Du fügst 1, 2 und 3 in dieser Reihenfolge in eine leere Warteschlange ein (enqueue). Welches Element gibt das erste dequeue zurück?
1, 2 und 3 zusammen
1
2
3
Antwort: 1. Eine Warteschlange ist „first in, first out“, also verlässt 1 sie zuerst. 3 wäre die Antwort für einen Stapel (pop), der das neueste Element zurückgibt.
7So sehen Prüfungsaufgaben aus
Leicht: Begriffe und Fakten. LIFO und FIFO, was ein Knoten, eine Wurzel oder ein Blatt ist, die BST-Regel, was eine Hashfunktion tut.
Mittel: Anwendung der Konzepte. Welche Struktur zu einer Aufgabe passt, das Ergebnis von push und pop oder von BST-Einfügungen, Baumtraversierungen, eine Hashtabelle mit linearem Sondieren, Kosten in Big O.
Schwer: Fälle und Analyse. Ausgeglichene Bäume, Heaps in Arrays, B-Bäume, Tries, Union-Find, Bloomfilter und Entwürfe wie ein LRU-Cache.
Bei einem Heap, der ab Index 0 in einem Array gespeichert ist, liegen die Kinder von Index i bei 2i + 1 und 2i + 2, und sein Elternknoten liegt bei ⌊(i − 1) / 2⌋.
Was ist der Hauptunterschied zwischen einem statischen und einem dynamischen Array?
AEin statisches Array erlaubt einen langsameren Indexzugriff
BEin dynamisches Array kann wachsen, indem es in einen größeren Speicherblock umzieht
CEin dynamisches Array speichert seine Elemente in verketteten Knoten, damit es einzeln wachsen kann
DEin statisches Array kann nur Zahlen speichern
Tipps anzeigen
Python-Listen und Java-ArrayLists sind Beispiele für eines davon.
Zwei falsche Antworten sind jetzt durchgestrichen. Eine der beiden übrigen ist richtig.
Antwort und Erklärung anzeigen
Warum das die Antwort ist
Ein statisches Array hat eine feste Größe; ein dynamisches Array reserviert ein größeres Array und kopiert die Elemente, wenn es voll ist.
Antwort
B · Ein dynamisches Array kann wachsen, indem es in einen größeren Speicherblock umzieht
Beispiel 2Mittel
Wie funktioniert extract-min in einem binären Min-Heap?
ADas letzte Element des Arrays entfernen
BDas letzte Element in die Wurzel verschieben und nach unten wandern lassen
CDie Wurzel entfernen und alle Elemente um eine Stelle nach links verschieben
DAlle Blätter nach dem neuen Minimum durchsuchen
Tipps anzeigen
Halte den Baum vollständig und korrigiere dann die Ordnung.
Zwei falsche Antworten sind jetzt durchgestrichen. Eine der beiden übrigen ist richtig.
Antwort und Erklärung anzeigen
Warum das die Antwort ist
Das letzte Element füllt die Lücke in der Wurzel und wird mit seinem kleineren Kind vertauscht, bis die Heap-Eigenschaft gilt; das kostet O(log n).
Antwort
B · Das letzte Element in die Wurzel verschieben und nach unten wandern lassen
Beispiel 3Schwer
Wie hoch sind ohne Union by Rank und Pfadkompression die Kosten eines einzelnen find im schlechtesten Fall in einer Union-Find-Struktur mit n Elementen?
AO(1)
BO(α(n))
CO(log n)
DO(n)
Tipps anzeigen
Die Bäume können entarten.
Zwei falsche Antworten sind jetzt durchgestrichen. Eine der beiden übrigen ist richtig.
Antwort und Erklärung anzeigen
Warum das die Antwort ist
Naive Vereinigungen können Bäume zu einer langen Kette verbinden, sodass find n − 1 Elternzeigern folgen muss; die beiden Heuristiken bringen es nahe an konstante Kosten.
Antwort
D · O(n)
Fragen und Antworten
Datenstrukturen: Worum geht es?
Eine Datenstruktur ist eine Art, Daten im Speicher so zu organisieren, dass bestimmte Operationen schnell sind: ein Element finden, eines hinzufügen, eines entfernen.
Keine Struktur ist bei allem schnell. Eine Struktur zu wählen heißt zu wählen, welche Operationen günstig sein sollen. Ihre Kosten werden in Big O angegeben, wobei n die Anzahl der Elemente ist.
Datenstrukturen: Wie lernt man es Schritt für Schritt?
Was eine Datenstruktur ist
Stapel und Warteschlangen
Bäume, Heaps, Hashtabellen und Graphen
Das Verfahren Schritt für Schritt
Ein durchgerechnetes Beispiel
Häufige Fehler
So sehen Prüfungsaufgaben aus
Datenstrukturen: Was wird geübt?
Leicht: Begriffe und Fakten
Mittel: Konzepte anwenden
Schwer: Fälle und Analyse
Jede Frage hat vier Antwortmöglichkeiten, und nur eine ist richtig. Du hängst fest? Öffne zuerst einen kleinen Tipp und die vollständige Erklärung erst, wenn du sie brauchst.
So funktioniert das Üben
Jede Frage hat vier Antwortmöglichkeiten, und nur eine ist richtig.
Du hängst fest? Öffne zuerst einen kleinen Tipp und die vollständige Erklärung erst, wenn du sie brauchst.
Dein Fortschritt, deine Fehler und gespeicherten Aufgaben bleiben erhalten, damit du vor der Prüfung wiederholen kannst.