Informatik

Datenstrukturen erkennen und passend auswählen

Datenstrukturen erkennen und passend auswählen
Datenstrukturen erkennen und passend auswählen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Eine Datenstruktur ordnet Daten so, dass ein Programm sie speichern, finden und verändern kann. Welche Struktur geeignet ist, hängt vor allem davon ab, welche Operationen häufig gebraucht werden: zugreifen, suchen, einfügen oder löschen.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Warum Programme Datenstrukturen brauchen

Ein einzelner elementarer Datentyp speichert gewöhnlich einen Wert, zum Beispiel eine ganze Zahl, eine Zeichenkette oder einen Wahrheitswert. Eine Datenstruktur fasst mehrere Werte zusammen oder stellt Beziehungen zwischen ihnen her.

Die Verkaufszahlen 500, 800, 600, 1200, 950 lassen sich beispielsweise gemeinsam in einem Array speichern. Dadurch kann ein Programm einzelne Werte über ihre Position abrufen oder alle Werte nacheinander verarbeiten.

Typische Operationen auf Datenstrukturen sind:

  • Einfügen: einen Wert ergänzen
  • Löschen: einen Wert entfernen
  • Suchen: einen bestimmten Wert finden
  • Zugreifen: einen bekannten Wert lesen oder verändern
  • Sortieren: Werte in eine Reihenfolge bringen
Definition

Datenstruktur

Eine Datenstruktur ist eine festgelegte Art, Daten anzuordnen und zu verknüpfen. Zu ihr gehören die möglichen Operationen auf diesen Daten.

Merke

Nicht die Datenmenge allein entscheidet über die passende Struktur. Entscheidend ist, was das Programm mit den Daten tun soll.

Teste dich
Frage 1 von 1LeichtWelche Aussage beschreibt eine Datenstruktur am besten?
Lösung: Sie ordnet Daten und legt mögliche Zugriffs- und Änderungsoperationen fest. — Eine Datenstruktur beschreibt die Organisation der Daten. Eine Folge von Anweisungen zur Lösung einer Aufgabe heißt dagegen Algorithmus.
Drei Blickwinkel auf Datenstrukturen

Datenstrukturen lassen sich nach verschiedenen Fragen einteilen. Diese Einteilungen widersprechen sich nicht, sondern betrachten unterschiedliche Eigenschaften.

Linear oder nichtlinear?

Bei einer linearen Datenstruktur stehen die Elemente in einer Folge. Dazu gehören Arrays, verkettete Listen, Stacks und Queues.

Bei einer nichtlinearen Datenstruktur verzweigen sich Beziehungen oder bilden ein Netz. Bäume bilden Hierarchien, Graphen allgemeinere Beziehungsnetze.

Statisch oder dynamisch?

Eine statische Struktur besitzt in ihrem jeweiligen Modell eine festgelegte Kapazität. Ein klassisches Feld ist ein typisches Beispiel.

Eine dynamische Struktur kann während der Laufzeit wachsen oder schrumpfen. Verkettete Listen ergänzen dazu neue Knoten und Referenzen.

Die genaue Bedeutung hängt von der Programmiersprache und der Implementierung ab. Klassische Felder haben eine feste Größe. JavaScript-Arrays können dagegen nachträglich wachsen. Deshalb darfst du die Aussage „Arrays sind immer unveränderlich groß“ nicht auf jede Sprache übertragen.

Verhalten oder Implementierung?

Ein abstrakter Datentyp beschreibt, welche Werte und Operationen erlaubt sind und wie sie sich verhalten. Er legt nicht zwingend fest, wie die Daten intern gespeichert werden.

Eine Queue ist beispielsweise durch das FIFO-Verhalten bestimmt. Sie kann intern mit einem Feld oder mit einer verketteten Liste umgesetzt werden.

Definition

Abstrakter Datentyp

Ein abstrakter Datentyp beschreibt das von außen sichtbare Verhalten einer Datenstruktur unabhängig von ihrer konkreten Implementierung.

Teste dich
Frage 1 von 1MittelEine Queue wird mit einem Array implementiert. Welche Aussage ist richtig?
Lösung: FIFO beschreibt das Verhalten der Queue; das Array beschreibt ihre konkrete Speicherung. — Der abstrakte Datentyp legt die Wirkung der Operationen fest. Unterschiedliche Datenstrukturen können dieses Verhalten technisch realisieren.
Array, Liste und Datensatz vergleichen

Array oder Feld

Ein Array ordnet Elemente über nummerierte Positionen, die Indizes. In vielen Sprachen beginnt der erste Index bei 0. Bei einem Array mit den Werten 4, 7, 9 liegt die 7 dann am Index 1.

Der bekannte Index ermöglicht direkten Zugriff. Bei einem klassischen Feld kostet dieser Zugriff unabhängig von der Elementzahl typischerweise O(1). Das bedeutet: Die Zahl der notwendigen Schritte wächst dabei nicht mit der Anzahl n der gespeicherten Elemente.

Soll jedoch am Anfang eines belegten Feldes ein Wert eingefügt werden, müssen viele vorhandene Werte verschoben werden. Im ungünstigen Fall wächst der Aufwand proportional zu n und wird als O(n) beschrieben.

Verkettete Liste

Eine verkettete Liste besteht aus Knoten. Jeder Knoten enthält Daten und mindestens eine Referenz auf den nächsten Knoten:

Video 1 → Video 2 → Video 3

Soll hinter Video 1 ein neues Element eingefügt werden, erhält der neue Knoten zuerst die Referenz auf Video 2. Danach verweist Video 1 auf den neuen Knoten. So bleibt der restliche Listenabschnitt erreichbar.

Einfügen und Löschen erfordern kein Verschieben aller folgenden Elemente. Die betreffende Stelle muss aber zunächst bekannt sein. Ohne direkten Verweis muss die Liste vom Anfang aus durchlaufen werden; eine Positionssuche kann deshalb O(n) benötigen.

Merke

Beim Einfügen in eine verkettete Liste sicherst du zuerst die Verbindung zum bisherigen Nachfolger. Erst danach änderst du die Referenz des vorherigen Knotens.

Datensatz oder Record

Ein Datensatz fasst zusammengehörige Werte mit unterschiedlichen Bedeutungen zusammen. Ein Schülerdatensatz könnte beispielsweise die Felder Name, Geburtsjahr und Klassenstufe enthalten.

Das unterscheidet ihn von einem klassischen Array gleichartiger Werte: Ein Array eignet sich etwa für zehn Messwerte, ein Datensatz für verschiedene Angaben zu einem Gegenstand oder einer Person.

AnforderungGeeignete StrukturEntscheidender Grund
Messwert über bekannte Position abrufenArraydirekter Indexzugriff
Zahl der Elemente flexibel verändernverkettete ListeKnoten können ergänzt oder entfernt werden
verschiedenartige Eigenschaften eines Objekts bündelnDatensatzbenannte Felder mit unterschiedlichen Bedeutungen
Teste dich
Frage 1 von 2MittelEine Anwendung speichert zehn Temperaturmessungen und greift häufig über die Messposition darauf zu. Welche Struktur passt am besten?
Lösung: Ein Array — Gleichartige Werte mit häufigem Zugriff über ihre Position passen zu einem Array.
Frage 2 von 2SchwerEine Wiedergabeliste wird häufig zwischen zwei bekannten Titeln erweitert. Warum kann eine verkettete Liste sinnvoll sein?
Lösung: Die Referenzen können angepasst werden, ohne alle folgenden Titel zu verschieben. — Ist die Einfügestelle bereits bekannt, werden nur die beteiligten Referenzen geändert. Das spart das Verschieben nachfolgender Elemente.
Stack und Queue am Verhalten erkennen

Stack und Queue sind lineare abstrakte Datentypen. Beide können mit einem Feld oder einer verketteten Liste implementiert werden. Sie unterscheiden sich darin, welches Element als Nächstes entfernt wird.

Stack: zuletzt hinein, zuerst heraus

Ein Stack arbeitet nach LIFO: last in, first out. push legt ein Element oben ab, pop entfernt das oberste Element und peek liest es, ohne es zu entfernen.

Beispiel Rückgängig-Funktion:

  1. Du tippst A.
  2. Du tippst B.
  3. Du tippst C.
  4. Die Aktionen liegen in dieser Reihenfolge auf dem Stack.
  5. Beim Rückgängigmachen wird zuerst die letzte Aktion, also C, entfernt.

Stacks eignen sich außerdem für Browserverläufe und Klammerprüfungen. Bei einer Klammerprüfung wird jeder Öffner abgelegt. Ein Schließer muss zum obersten Öffner passen. Ist der Stack vorher leer oder bleiben am Ende Öffner übrig, ist die Klammerfolge fehlerhaft.

Queue: zuerst hinein, zuerst heraus

Eine Queue arbeitet nach FIFO: first in, first out. enqueue fügt am Ende ein Element ein, dequeue entfernt das Element am Kopf.

Beispiel Druckerwarteschlange:

  1. Auftrag A wird eingereiht.
  2. Danach folgen B und C.
  3. Der Drucker verarbeitet zuerst A, anschließend B und zuletzt C.

Queuen eignen sich für Druckaufträge, Ereignisse und gepufferte Nachrichten. Bei einer begrenzten Implementierung müssen Sonderfälle behandelt werden: dequeue bei einer leeren Queue führt zum Underflow, Einfügen in eine volle Struktur zum Overflow.

Lückentext

Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.

Bei einem Stack wird das zuletzt eingefügte Element nach dem Prinzip zuerst entfernt. Eine Queue arbeitet dagegen nach . Das Einfügen in eine Queue heißt , das Entfernen heißt .

Lösungen: Lücke 1: LIFO; Lücke 2: FIFO; Lücke 3: enqueue; Lücke 4: dequeue. LIFO kennzeichnet den Stack, FIFO die Queue. Die Queue-Operationen heißen enqueue und dequeue.
Teste dich
Frage 1 von 2MittelDie Aktionen Zeichnen, Färben, Löschen werden nacheinander auf einem Undo-Stack gespeichert. Welche Aktion wird zuerst rückgängig gemacht?
Lösung: Löschen — Löschen wurde zuletzt abgelegt und liegt deshalb oben auf dem Stack.
Frage 2 von 2SchwerMehrere Personen warten an einer gewöhnlichen Kasse. Welche Struktur bildet die Bedienreihenfolge ab?
Lösung: Eine Queue, weil die zuerst eingereihte Person zuerst bedient wird. — Eine gewöhnliche Warteschlange folgt FIFO und wird deshalb als Queue modelliert.
Baum, Graph und Hashtabelle einordnen

Baum: eine Hierarchie

Ein Baum beginnt an einer Wurzel und verzweigt sich über Knoten. Knoten ohne Kinder heißen Blätter. Ein Dateisystem mit Ordnern und Unterordnern lässt sich als Baum darstellen.

In einem Binärbaum besitzt jeder Knoten höchstens zwei Kinder. Ein binärer Suchbaum ordnet seine Schlüssel so, dass die Suche gezielt einem passenden Teilbaum folgen kann.

Graph: ein Beziehungsnetz

Ein Graph besteht aus Knoten und Kanten. Auf einer Straßenkarte können Städte die Knoten und Straßen die Kanten bilden. Anders als bei einem Baum dürfen allgemeinere Graphen mehrere Wege, Querverbindungen und Zyklen enthalten.

Die Breitensuche untersucht Verbindungen schrittweise Ebene für Ebene. Die Tiefensuche folgt zunächst einem Weg weiter in die Tiefe.

Hashtabelle: Zugriff über Schlüssel

Eine Hashtabelle speichert Schlüssel-Wert-Paare. Eine Hashfunktion berechnet aus einem Schlüssel eine Position oder Zuordnung. In einer Kontaktliste kann der Name als Schlüssel dienen und zur gespeicherten Telefonnummer führen.

Hashtabellen eignen sich besonders für den schnellen Zugriff über bekannte Schlüssel. Soll die Datenstruktur ihre Schlüssel dagegen geordnet ausgeben, kann eine geeignete Baumstruktur vorteilhafter sein.

Teste dich
Frage 1 von 3LeichtWelche Struktur modelliert Städte und Straßen am unmittelbarsten?
Lösung: Ein Graph mit Städten als Knoten und Straßen als Kanten — Graphen stellen allgemeine Beziehungen zwischen Knoten durch Kanten dar.
Frage 2 von 3MittelEin Programm soll zu einem bekannten Benutzernamen schnell das zugehörige Profil finden. Welche Struktur liegt nahe?
Lösung: Eine Hashtabelle mit dem Benutzernamen als Schlüssel — Eine Hashtabelle ordnet einem Schlüssel einen Wert oder eine Speicherposition zu.
Frage 3 von 3SchwerEine Ordnerstruktur besitzt einen Hauptordner und mehrere Ebenen von Unterordnern. Welches Modell passt?
Lösung: Ein Baum, weil die Beziehungen eine Hierarchie bilden. — Eine verzweigte Eltern-Kind-Struktur wird durch einen Baum beschrieben.
Die passende Datenstruktur auswählen

Gehe bei der Auswahl in vier Schritten vor:

  1. Bestimme die Daten: Sind es gleichartige Werte, verschiedenartige Eigenschaften, eine Reihenfolge, eine Hierarchie oder ein Netz?
  2. Bestimme die häufigsten Operationen: Muss das Programm vor allem zugreifen, suchen, einfügen oder löschen?
  3. Beachte Bedingungen: Ist die Größe bekannt? Wird ein Schlüssel verwendet? Muss die Reihenfolge erhalten bleiben?
  4. Vergleiche die Kosten: Eine Stärke bei einer Operation kann eine Schwäche bei einer anderen bedeuten.
Beispiel

Ein Hilfesystem soll eingehende Anfragen grundsätzlich in ihrer Ankunftsreihenfolge bearbeiten.

Daten: mehrere Anfragen in zeitlicher Reihenfolge.

Benötigte Operationen: neue Anfrage hinten einfügen; älteste Anfrage vorn entnehmen.

Passende Struktur: Queue.

Begründung: Das geforderte Verhalten entspricht FIFO. Ob die Queue intern durch eine verkettete Liste oder einen Ringpuffer umgesetzt wird, ist eine zweite Entscheidung.

Übung: Begründe deine Wahl

Eine Lern-App soll Begriffe unter einem eindeutigen Stichwort speichern. Wird das Stichwort eingegeben, soll die Erklärung schnell gefunden werden. Welche Datenstruktur würdest du wählen?

Gut zu wissen

Eine passende Lösung ist eine Hashtabelle: Das Stichwort dient als Schlüssel, die Erklärung als zugehöriger Wert. Ein Stack oder eine Queue wäre unpassend, weil deren wichtigste Regel die Entnahmereihenfolge und nicht die Suche über einen Schlüssel bestimmt.

Teste dich
Frage 1 von 2SchwerEine Anwendung braucht häufig direkten Zugriff auf den fünften Messwert, fügt aber nur selten Werte in der Mitte ein. Welche Wahl ist am besten begründet?
Lösung: Ein Array, weil der Indexzugriff häufig und direkt möglich ist. — Die häufigste benötigte Operation ist der Zugriff über eine bekannte Position. Deshalb überwiegt hier die Stärke des Arrays.
Frage 2 von 2SchwerEine Struktur soll Aufgaben nach ihrer Wichtigkeit statt streng nach Ankunftszeit ausgeben. Warum genügt eine gewöhnliche Queue nicht?
Lösung: Eine gewöhnliche Queue folgt FIFO und berücksichtigt keine Priorität. — Wenn die höchste Priorität über die Entnahme entscheiden soll, wird eine Vorrangwarteschlange statt einer gewöhnlichen FIFO-Queue benötigt.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Datenstruktur
    • Auswahl nach Datenform
      • Folge: Array oder Liste
      • Eigenschaften eines Objekts: Datensatz
      • Hierarchie: Baum
      • Beziehungsnetz: Graph
    • Auswahl nach Operation
      • Indexzugriff: Array
      • Einfügen über Referenzen: verkettete Liste
      • Schlüsselzugriff: Hashtabelle
    • Auswahl nach Reihenfolge
      • LIFO: Stack
      • FIFO: Queue
    • Zwei Ebenen der Beschreibung
      • Verhalten: abstrakter Datentyp
      • Speicherung: konkrete Implementierung
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWelche Abkürzung gehört zur Queue?
Lösung: FIFO — Eine gewöhnliche Queue hält die Einfügereihenfolge ein und arbeitet nach FIFO.
Frage 2 von 3MittelWas ist der wichtigste Unterschied zwischen einem Array und einer verketteten Liste?
Lösung: Das Array bietet direkten Indexzugriff; die Liste verbindet Knoten durch Referenzen. — Beide Strukturen können mehrere Werte speichern. Sie unterscheiden sich vor allem in Aufbau und Operationskosten.
Frage 3 von 3SchwerEin Browser soll die zuletzt ausgeführte Aktion zuerst rückgängig machen und Benutzerprofile zusätzlich über Namen finden. Welche Kombination passt?
Lösung: Ein Stack für die Aktionen und eine Hashtabelle für die Profile — Verschiedene Anforderungen dürfen zu verschiedenen Datenstrukturen führen: Der Stack bildet die Rückgängig-Reihenfolge ab, die Hashtabelle den Zugriff über Namen.

Wenn du eine Datenstruktur auswählst, frage zuerst nach den häufig benötigten Operationen. Begründe danach, warum die Stärken der gewählten Struktur genau zu diesen Operationen passen.

Passend dazu