Informatik · Klasse 6–12 · aktualisiert
Datenstrukturen erkennen und passend auswählen
Du lernst, wie eine Datenstruktur viele Daten ordnet, erkennst Array, Liste, Stack, Queue und Baum und wählst die passende Struktur aus.
0 von 13 Aufgaben gelöst
Kurz gesagt
Ein elementarer Datentyp nimmt nur einen Wert auf. Eine Datenstruktur ordnet viele Daten und macht sie über Operationen zugänglich. Welche Struktur passt, hängt von den Operationen ab, die du brauchst. Ein abstrakter Datentyp legt fest, was die Operationen tun, aber nicht, wie.
Eine Warteschlange vor dem Drucker, der Verlauf deines Browsers, ein Notenheft mit Platz für Noten: Überall liegen viele Daten in einer bestimmten Ordnung. Wie sie geordnet sind, entscheidet, was du damit schnell und einfach tun kannst. Hier lernst du die wichtigsten Strukturen kennen und wie du die passende auswählst.
Deine Lernziele
Hake ab, was du schon kannst. Löst du alle Aufgaben eines Abschnitts, hakt Mela das Ziel für dich ab.
4 Abschnitte
Ein Datentyp fasst Werte und die Operationen dafür zu einer Einheit zusammen. Eine Operation ist eine Tätigkeit mit den Daten, zum Beispiel speichern, lesen oder löschen. Beispiele für Datentypen sind Ganzzahlen, Kommazahlen oder Zeichenketten.
Elementare Datentypen heißen auch einfache oder primitive Datentypen. Sie können nur einen Wert aus ihrem Wertebereich aufnehmen. Bei Zahlen sind die Grundoperationen die Grundrechenarten.
Eine Datenstruktur ist ein Objekt, das Daten speichert und organisiert. Die Daten werden in einer bestimmten Art und Weise angeordnet und verknüpft. So sind Zugriff und Verwaltung effizient möglich, das heißt ohne unnötigen Aufwand. Eine Datenstruktur ist nicht nur durch die enthaltenen Daten gekennzeichnet, sondern vor allem durch die Operationen, mit denen du auf die Daten zugreifst und sie verwaltest.
Zusammengesetzte Datentypen bestehen aus einfacheren Datentypen. Weil sie theoretisch beliebig komplex werden können, zählt man sie auch häufig schon zu den Datenstrukturen.
Definition
Elementarer Datentyp
Ein elementarer Datentyp (auch einfacher oder primitiver Datentyp) kann nur einen Wert seines Wertebereichs aufnehmen.
Merke: Ein elementarer Datentyp hält einen Wert. Eine Datenstruktur ordnet viele Daten und macht sie über Operationen zugänglich.
Teste dich
Ein Datensatz (auch Tupel) ist eine sehr einfache Datenstruktur. Er enthält meist in einer festen Anzahl und Folge Werte, die selbst wieder Werte enthalten können. Ein Datensatz für eine Prüfung hat zum Beispiel die Felder Fach, Schüler, Punkte, Lehrer und Termin.
Ein Array (auch Feld) speichert mehrere Variablen vom selben Basisdatentyp, zum Beispiel lauter Noten. Du erreichst jedes Element über einen Index, das ist seine Platznummer. Die notwendigen Operationen sind das indizierte Speichern und das indizierte Lesen. Beide greifen direkt auf jedes Element zu.
In einer verketteten Liste enthält jedes Listenelement einen Verweis auf das nächste Element. So entsteht eine Kette von Objekten. Die Liste kann beliebig viele Objekte speichern. Bei einer doppelt verketteten Liste gibt es auch einen Verweis auf das vorhergehende Element.
Im Stapelspeicher (englisch Stack) werden die gespeicherten Objekte nur in umgekehrter Reihenfolge wieder gelesen. Das heißt LIFO: Last In, First Out, also zuletzt hinein, zuerst heraus. Mit push legst du ein Objekt ab. Mit pop liest du das zuletzt gespeicherte Objekt und entfernst es vom Stapel. Die Operation top (oder peek) liest das oberste Element, ohne es zu löschen. Sie ist nicht zwingend vorgeschrieben.
In einer Warteschlange (englisch Queue) werden die Objekte in der Reihenfolge wieder gelesen, in der sie gespeichert wurden. Das heißt FIFO: First In, First Out. Mit enqueue speicherst du ein Objekt. Mit dequeue liest du das zuerst gespeicherte Objekt und entfernst es.
Ein Baum besteht aus Knoten und Kanten. Eine Kante verbindet zwei Knoten. Ein bestimmter Knoten ist die Wurzel. Sie ist der einzige Knoten ohne eingehende Kante. Jeder andere Knoten hat genau eine eingehende Kante. Knoten unter einem Elternteil heißen Kinder. Ein Knoten ohne Kinder heißt Blatt. Ein Baum eignet sich, um hierarchische Strukturen abzubilden. Ein Sonderfall ist der Binärbaum, in dem jeder Knoten höchstens zwei Kinder hat.
Auch ein Graph ist eine Datenstruktur. Bei ihm muss die Verknüpfung nicht nur in eine Richtung laufen. Seine Operationen sind das Einfügen, Löschen und Finden eines Objekts. Bäume sind spezielle Formen von Graphen.
| Struktur | Aufbau | Typische Operationen |
|---|---|---|
| Array | Mehrere Variablen vom selben Basisdatentyp | indiziertes Speichern, indiziertes Lesen |
| Verkettete Liste | Jedes Element hat einen Verweis auf das nächste | Einfügen, Löschen und Suchen |
| Stapelspeicher | Zuletzt gespeichert, zuerst gelesen | push, pop, (top oder peek) |
| Warteschlange | FIFO: zuerst gespeichert, zuerst gelesen | enqueue, dequeue |
| Baum | Knoten und Kanten mit einer Wurzel | Suchen (bei geordneten Bäumen schnell) |
Beispiel: Schlange an der Kasse (ausgedachtes Beispiel)
- 1Anna, Ben und Cem stellen sich in dieser Reihenfolge an der Kasse an.
- 2Das sind drei enqueue-Aufrufe: erst Anna, dann Ben, dann Cem.
- 3Die Kasse ruft dequeue auf: Anna wird bedient und verlässt die Schlange.
- 4Als Nächstes ist Ben vorn, dann Cem. Wer zuerst kam, wird zuerst bedient.
Merke: Stapelspeicher: Das zuletzt gespeicherte Objekt kommt zuerst heraus. Warteschlange: FIFO, das zuerst gespeicherte Objekt kommt zuerst heraus.
Teste dich
Die Wahl der Datenstruktur zählt. Bei vielen Algorithmen hängen die benötigte Laufzeit und der Speicherplatz davon ab, ob eine geeignete Datenstruktur verwendet wird. Frage dich deshalb zuerst: Welche Operationen brauche ich?
Soll die Reihenfolge erhalten bleiben, passt eine Warteschlange. Sie dient als Puffer: Objekte werden zwischengespeichert, bevor sie weiterverarbeitet werden. So werden langsame Geräte wie ein Drucker vom Programm entkoppelt. Graphische Oberflächen puffern Ereignisse der Maus und Tastatur in einer Message Queue nach dem FIFO-Prinzip, also in der Reihenfolge ihres Auftretens. Wird dagegen das zuletzt gespeicherte Objekt zuerst gebraucht, passt ein Stapelspeicher. Bei Kartenspielen, in denen Karten auf einen Stapel gelegt oder von einem Stapel gezogen werden, sind Stapelspeicher geeignet.
Soll der Zugriff über eine Platznummer laufen, passt ein Array. Soll er über einen Schlüssel laufen, passt eine Zuordnungstabelle. Sie heißt auch assoziatives Array. Eine mögliche Umsetzung ist die Hashtabelle. Bei ihr berechnet eine Funktion die Position eines Objekts. Dadurch musst du nicht viele Objekte durchsuchen. Es kann aber passieren, dass zwei verschiedene Schlüssel zum selben Feld führen. Das nennt man Kollision. Eine Hashtabelle pflegt keine Ordnung zwischen den Schlüsseln.
Bäume haben bei geordneten Elementen, besonders bei Suchbäumen, einen Vorteil: Du findest Elemente schnell. Die Suche dauert bei einem Baum logarithmisch, bei einem Feld linear. Bei sehr vielen Daten wächst der Aufwand im Baum also viel langsamer. Außerdem können Bäume alle Indexwerte in einer Ordnung wiedergeben. Dafür brauchen sie einen größeren Verwaltungsaufwand als Hashtabellen.
Auch die Größe spielt eine Rolle. Eine statische Datenstruktur hat eine feste Größe, die sich zur Laufzeit nicht ändert. Brauchst du mehr Platz, musst du eine neue Struktur erstellen und alle Daten hineinschreiben. Eine dynamische Datenstruktur kann ihre Größe ändern, während das Programm läuft. Bei einer verketteten Liste muss die maximale Anzahl der Elemente nicht festgelegt werden.
Begründe deine Wahl immer so: Aufgabe nennen, nötige Operationen nennen, dann sagen: „Ich wähle …, weil …“.
| Aufgabe | Struktur | Grund |
|---|---|---|
| Druckaufträge später auf einem langsamen Drucker ausführen | Warteschlange | Sie puffert die Aufträge und entkoppelt das Programm vom Drucker |
| Besuchte Seiten in der Verlaufsfunktion eines Browsers | Stapelspeicher | Ein Stapel liest die Objekte in umgekehrter Reihenfolge |
| Noten in einem Notenheft mit Platz für 10 Noten | Array | Jede Note liegt an einem Index, der Zugriff läuft direkt darüber |
| Daten über einen Schlüssel nachschlagen | Zuordnungstabelle, etwa als Hashtabelle | Die Position wird direkt berechnet |
Merke: Erst die Operationen klären, dann die Struktur wählen: Reihenfolge, Platznummer, Schlüssel, Ordnung oder wechselnde Größe.
Teste dich
Ein abstrakter Datentyp, kurz ADT, ist ein Verbund von Daten zusammen mit der Definition aller zulässigen Operationen, die auf sie zugreifen. Auf die Daten kommst du nur über diese Operationen. Die Daten sind deshalb nach außen gekapselt, also von außen geschützt. Du kannst nicht ungewollt in die innere Struktur eingreifen.
Ein ADT beschreibt, was die Operationen tun. Das nennt man Semantik. Er beschreibt aber noch nicht, wie sie es tun. Das Wie ist die Implementierung, also die konkrete Umsetzung.
Beim Stapelspeicher und bei der Warteschlange sehen die Signaturen gleich aus. Eine Signatur sagt, was in eine Operation hineingeht und was herauskommt. Erst mit der Semantik zeigen sich Unterschiede: Der Stapel arbeitet nach LIFO, die Warteschlange nach FIFO.
Derselbe ADT kann unterschiedlich umgesetzt sein. Eine Warteschlange wird gewöhnlich als verkettete Liste implementiert. Sie kann intern aber auch ein Array verwenden. Dann ist die Anzahl der Elemente begrenzt. Häufig ist sie ein Ringpuffer: Je ein Zeiger zeigt auf Anfang und Ende der Warteschlange, und der Puffer hat eine feste Größe. Ein Stapelspeicher wird gewöhnlich als Liste implementiert, kann aber auch ein Vektor sein. Eine Hashtabelle wird in der Praxis als Array implementiert.
Der Übergang zwischen Datenstruktur und abstraktem Datentyp ist nicht klar definiert. Er hängt von der Betrachtungsweise ab: Liegt der Schwerpunkt nicht auf der konkreten Umsetzung der Operationen, sprichst du oft von einem ADT.
Definition
Abstrakter Datentyp (ADT)
Ein ADT ist ein Verbund von Daten zusammen mit der Definition aller zulässigen Operationen. Er legt fest, was die Operationen tun, aber noch nicht, wie sie es tun.
Beispiel: Eine Liste in Java: Schnittstelle und Implementierungen
- 1In der Programmiersprache Java ist java.util.List eine Schnittstelle (ein Interface). Sie legt die Listenoperationen fest.
- 2java.util.LinkedList und java.util.ArrayList sind zwei konkrete Implementierungen dieser Schnittstelle.
- 3Je nach Einsatzzweck wählst du die passende Implementierung.
- 4Wird hauptsächlich über den Index auf die Liste zugegriffen, ist eine verkettete Liste eine schlechte Wahl. Für das n-te Element sind dann n Operationen nötig.
Merke: ADT = was die Operationen tun. Implementierung = wie sie es tun. Dieselbe Schnittstelle kann mehrere Implementierungen haben.
Teste dich
Alles auf einen Blick
Datenstruktur
Elementarer Datentyp
nimmt nur einen Wert aus seinem Wertebereich auf
Datenstruktur
ordnet viele Daten und ist vor allem durch ihre Operationen gekennzeichnet
Stapel und Warteschlange
Der Stapel liest das zuletzt gespeicherte Objekt zuerst (push, pop), die Warteschlange nach FIFO (enqueue, dequeue)
Auswahl
Erst die nötigen Operationen klären, dann die Struktur nennen und begründen
Abstrakter Datentyp
legt fest, was die Operationen tun, nicht wie
Implementierung
Eine Warteschlange wird gewöhnlich als verkettete Liste umgesetzt, intern kann sie auch ein Array verwenden
Musteraufgabe · Schritt für Schritt
Drei Aufgaben einer Datenstruktur zuordnen (ausgedachte Aufgabe)
- 1Aufgabe A: Zu jedem Namen soll schnell die Telefonnummer gefunden werden.
- 2Schritt 1: Der Zugriff läuft über einen Schlüssel, den Namen, nicht über eine Platznummer.
- 3Lösung A: Zuordnungstabelle, etwa als Hashtabelle. Die Position der Nummer wird direkt berechnet.
- 4Aufgabe B: Der Rückgängig-Knopf eines Zeichenprogramms macht immer die zuletzt ausgeführte Aktion zuerst rückgängig.
- 5Schritt 2: Das zuletzt Gespeicherte wird zuerst gebraucht, das ist LIFO.
- 6Lösung B: Stapelspeicher. Jede Aktion kommt per push hinein, der Knopf ruft pop auf.
- 7Aufgabe C: Ordner mit Unterordnern sollen dargestellt werden.
- 8Lösung C: Baum. Der oberste Ordner ist die Wurzel, jeder Unterordner ein Kind. Ein Baum bildet hierarchische Strukturen ab.
Fehler finden
Prüfe die Aussagen zu einem Stapel mit drei Buchstaben (ausgedachtes Beispiel) In einer Zeile steckt ein Fehler. Tippe sie an.
Fehler in Zeile 3Hier sind Stapel und Warteschlange vertauscht. Richtig: pop liest das zuletzt gespeicherte Objekt, also C, und entfernt es vom Stapel.
Lückentext
Wähl in jeder Lücke das passende Wort und prüf dann deine Antworten.
Ein Ganzzahl-Typ ist ein elementarer Datentyp und nimmt auf. Beim Stapelspeicher liest pop das gespeicherte Objekt. Ein abstrakter Datentyp legt fest, die Operationen tun, während die Implementierung die Umsetzung im Speicher regelt.
Karteikasten
Erst selbst überlegen, dann umdrehen.
Übung mit Feedback