Algorithmen & Datenstrukturen
2. Semester Informatik (HSLU)
2. Semester Informatik (HSLU)
-
- 1 / 134
-
Cartes-fiches
Es gibt verschiedene Datenstrukturen mit unterschiedlichen Fähigkeiten und Eigenschaften
ArrayList ist nicht ein Beispiel einer häufig eingesetzten, konkreten Datenstruktur in Java
Die Auswahl der geeigneten Datenstruktur erfolgt aufgrund der konkreten Anforderungen, z.B.?
Aufgrund der Eigenschaften wie Zugriffsart, Art und Häufigkeit der Operationen, Datenmenge und –struktur
Wie sind die Daten in einer Datenstruktur, welche als reine Sammlung implementiert ist, abgelegt?
Die einzelnen Datenelemente sind darin ungeordnet abgelegt und die Reihenfolge ist nicht deterministisch. - Analogie: Steinhaufen.
Es gibt einige elementare Methoden die auf Datenstrukturen angewendet werden können. Welche sind diese?
- Einfügen von Elementen
- Suchen von Elementen
- Entfernen von Elementen
- Ersetzen von Elementen
in Datenstrukturen.
Nenne Operationen in Abhängigkeit einer (optionalen) Reihenfolge oder Sortierung.
- Nachfolger: nachfolgendes Datenelement.
- Vorgänger: vorangehendes Datenelement.
- Sortierung: Sortieren der Datenelemente nach best. Kriterien.
- Maxima/Minima: kleinstes / grösstes Datenelement.
Eine statische Datenstruktur hat nach ihrer Initialisierung eine feste, unveränderliche Grösse. Sie kann somit nur eine beschränkte Anzahl Elemente aufnehmen. Überlege eine Analogie mit einer Getränkeflasche.
- Grösse der Flasche ist gegeben, ebenso maximaler Inhalt.
- Die Flasche selber nimmt immer den selben Platz ein!
Eine dynamische Datenstruktur hingegen kann ihre Grösse während der Lebensdauer verändern. Sie kann somit eine beliebige (durch verfügbaren Speicher begrenzt) Anzahl Elemente aufnehmen. Überlege eine Analogie mit einem Luftballon.
Je nach Gasvolumen dehnt sich der Luftballon räumlich aus oder zieht sich wieder zusammen
Benutze eine Analogie zu einer Fahrradkette um explizite Datenstrukturen zu erklären.
Analogie: Fahrradkette
- Kettenglieder sind miteinander verknüpft.
- Kettenglieder kennen ihre jeweiligen Nachbarglieder.
Was ist eine explizite Datenstruktur?
Bei expliziten Datenstrukturen werden die Beziehungen zwischen Elementen von jedem Element selber explizit mit Referenzen festgehalten.
Was ist eine implizite Datenstruktur?
Bei impliziten Datenstrukturen werden die Beziehungen zwischen den Datenelementen nicht von den Elementen selber festgehalten.
- Die Beziehungen werden quasi von «aussen» definiert, z.B. über eine externe Nummerierung.
Benutze eine Analogie zu einem Buchregal mit Büchern um eine implizite Datenstruktur zu erklären
Analogie: Buchregal mit Büchern
- Bücher stehen einfach (ggf. auch geordnet) nebeneinander.
- Das einzelne Buch weiss nicht wo es steht bzw. hingehört.
Was heisst es, wenn man bei einer Datenstruktur direkten Zugriff hat?
(Hilfe: Analogie Buchregal mit Büchern)
Bei direktem Zugriff hat man auf jedes einzelne Element direkten und unmittelbaren Zugriff.
Analogie: Buchregal mit Büchern.
- Alle Bücher stehen nebeneinander im Regal.
- Man kann jedes Buch direkt herausnehmen.
Was heisst es, wenn man bei einer Datenstruktur indirekten Zugriff hat?
(Hilfe: Tellerstapel in der Mensa)
Bei indirektem Zugriff hat man keinen direkten Zugriff auf bestimmte, einzelnen Datenelemente. Man kann allenfalls sequenziell ein Element nach dem anderen erhalten.
Analogie: Tellerstapel in der Mensa
- Man kann «einen» Teller nehmen, aber keinen bestimmten.
- Möchte man einen bestimmten Telle (oder alle), muss alle Teller sequenziell umstapeln bis der gewünschte Teller
gefunden ist.
Für was variiert der Aufwand von Operationen (Rechen- und Speicherkomplexität) in einer Datenstruktur?
Der Aufwand (Rechen- und Speicherkomplexität) variiert sowohl für die verschiedenen Operationen als auch oft in Abhängigkeit der enthaltenen Elementmenge in einer Datenstruktur.
Die Ordnung, also wie sich der Aufwand von Operationen in einer Datenstruktur in Abhängigkeit zur Anzahl Elemente verhält, interessiert uns nie
Meistens interessiert uns "nur" die Ordnung, also wie sich der Aufwand von Operationen in einer Datenstruktur in Abhängigkeit zur Anzahl der Elemente verhält
Meistens interessiert uns «nur» die Ordnung, also wie sich der Aufwand von Operationen in einer Datenstruktur in Abhängigkeit zur Anzahl der Elemente verhält.
Nenne Beispiele im Alltag
Beispiele:
- Buch auf einen Stapel legen (ungeordnet): -> O(1) Konstant
- Buch in der Bibliothek alphabetisch einordnen: im schlechtesten Fall O(n) Linear
- Eine unsortierte Menge von Büchern alphabetisch Ordnen: im schlechtesten Fall O(n2) Quadratisch (Polynomial)
Was kann man über dieses Bild sagen?
- Ein char-Array mit Platz für maximal 8 (length) Elemente
- Der Array hat noch vier freie Plätze
- Die Elemente sind weder sortiert noch fortlaufend eingefügt
Empfehlung: Leere Plätze mitten im Array möglichst vermeiden!
Was ist die Hauptvoraussetzung für binäres Suchen?
sortierte Datenmenge!
Wie gross ist der Aufwand, wenn man ein Element "C" von einer Array enfernt, wenn der Array unsortiert ist, aber fortlaufend befüllt wird?
Arrays sind statische Datenstrukturen, darum sollten sie nur verwendet werden, wenn was?
Wenn die Datenmenge klar beschränkt, von Anfang an bekannt, und eher klein ist
Wann sind Arrays effizient?
Wenn man «nur» einzelne, elementare Datentypen ablegen muss.
- Datentypen haben bekannte Grösse, und können somit in einer Reihung direkt als/im Array abgelegt werden. Mit dem Index kann direkt die Speicheradresse berechnet werden.
Wenn man nicht "nur" einzelne, elementare Datentypen ablegen muss, sind Collections den Arrays meist vorzuziehen. Weshalb?
da sie wesentlich objektorientierter sind, und es z.B. mit der ArrayList ebenfalls Implementationen gibt, die einen direkten, schnellen Zugriff per Index erlauben
Da wir keinen direkten Zugriff haben (sondern nur sequenziell) beträgt der Aufwand für die Suche eines Elementes in einer Liste grundsätzlich O(n).
- Unabhängig davon ob sortiert oder unsortiert.
- Unabhängig davon ob einfach oder doppelt verkettet.
Lässt sich der Aufwand bei der Suche nach einem Element "G" bei einer sortierten Liste von O(n) auf O(log n) reduzieren?
Ja, die Suche lässt sich bei sortierten Listen mit zusätzlichen Hilfsmitteln (-> Skiplisten) beschleunigen.
Damit wird ebenfalls O(log n) möglich
Einfach verkettete Liste:
Da wir mit dem Head eine Referenz auf das erste Element haben, können neue Element am Anfang einfach und schnell eingefügt werden. Der Aufwand beträgt: O(1)