Algorithmen & Datenstrukturen

2. Semester Informatik (HSLU)

2. Semester Informatik (HSLU)


C. C.
Diese Lernkarten behandeln grundlegende und fortgeschrittene Konzepte von Algorithmen und Datenstrukturen auf Universitätsniveau. Sie konzentrieren sich auf verschiedene Datenstrukturen wie Listen, Arrays und Stacks, sowie deren Implementierung, Operationen und Ressourcenbedarf. Die Karteikarten erklären auch Algorithmen wie binäres Suchen und deren Aufwand. Sie sind besonders nützlich für Studierende der Informatik, die ihr Verständnis von Algorithmen und Datenstrukturen vertiefen möchten, um effiziente Lösungen für komplexe Probleme zu entwickeln.
Cartes-fiches
134
Utilisateurs
20
Langue
Allemand
Catégorie
Informatique
Niveau
Université
Créé / Mis à jour
21.02.2017 / 08.09.2023

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.

Welche drei grundsätzliche Sortierungen und Reihenfolgen verwendet man oft bei Datenstrukturen?

(siehe Bild)

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? (Array)

- Ein char-Array mit Platz für maximal 16 (length) Elemente
- Der Array ist «voll», alle Positionen sind belegt
- Die Elemente sind sortiert eingefügt

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 sind Eigenschaften einer Array?

(siehe Bild)

Wir suchen nach einem Element G. Wie gross ist der Aufwand, wenn der Array unsortiert ist, aber fortlaufend befüllt wird?

Wir müssen den Array sequenziell durchsuchen.
Der Aufwand beträgt: O(n)

Wir suchen nach einem Element G. Wie gross ist der Aufwand, wenn der Array sortiert ist?

Wir können binär Suchen, der Aufwand beträgt somit: O(log n)

Was ist die Hauptvoraussetzung für binäres Suchen?

sortierte Datenmenge!

Wie funktioniert binäres Suchen?

(siehe Bild)

Wie gross ist der Aufwand, wenn man ein Element "C" einer Array anhängt, wenn der Array unsortiert ist, aber fortlaufend befüllt wird?

Wenn wir uns den Index des jeweils nächsten freien Platzes merken beträgt der Aufwand: O(1) -> Konstant

(siehe Bild)

Ohne diesen Trick: O(n)

Wie gross ist der Aufwand, wenn man ein Element "C" einer Array anhängt, wenn der Array sortiert ist?

Wir können zwar binär mit O(log n) die Position suchen, müssen dann aber die restlichen Elemente mit O(n) nach rechts schieben.

(siehe Bild)

Aufwand: O(log n) + O(n) -> O(n)

Wie gross ist der Aufwand, wenn man ein Element "C" von einer Array enfernt, wenn der Array unsortiert ist, aber fortlaufend befüllt wird?

- Wir müssen den Array sequenziell mit O(n) durchsuchen und können die Lücke mit dem letzten Element mit O(1) schliessen

(siehe Bild)

Aufwand: O(n) + O(1) -> O(n)

Wie gross ist der Aufwand, wenn man ein Element "C" von einer Array entfernt, wenn der Array sortiert ist?

- Wir können zwar binär mit O(log n) suchen, müssen die entstehende Lücke aber durch Linksrücken mit O(n) schliessen

(siehe Bild)

Aufwand: O(log n) + O(n) -> O(n)

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

Was ist eine einfach verkette Liste?

- Es gibt eine Referenz auf das erste Element -> head
- Jedes Element kennt seinen direkten Nachfolger

Was ist eine doppelt verkettete Liste?

- Es gibt Referenzen auf das erste (-> head) und das letzte (-> tail) Element in der Liste
- Jedes Element kennt seinen direkten Vorgänger und Nachfolger

Was sind die wichtigsten Eigenschaften eine Liste?

(siehe Bild)

Wie gross ist der Aufwand bei der Suche nach dem Element "G" in einer Liste?

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

Wie gross ist der Aufwand beim Ergänzen eines Elementes "C" einer unsortierten Liste?

Dazu handelt es sich um eine einfach verkettete Liste!

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)

Wie gross ist der Aufwand beim Ergänzen eines Elementes "C" einer unsortierten Liste?

Dazu handelt es sich um eine doppelt verkettete Liste!

Bei doppelt verketteter Liste:

Analog kann zusätzlich auch am Ende der Liste (tail) mit Aufwand O(1) eingefügt bzw. angehängt werden.

Study