Algorithmen & Datenstrukturen
2. Semester Informatik (HSLU)
2. Semester Informatik (HSLU)
-
- 1 / 134
-
Cartes-fiches
Was ist der Heap?
In diesem Speicherbereich werden die Objekte gespeichert, d.h. deren Instanzvariablen bwz. Zustände. Nicht mehr referenzierbare Objekte werden durch den Garbage Collector (GC) automatisch gelöscht
Was ist der Call Stack?
Letztendlich wird bei der Ausführung eines Java-Programms eine Kette von Methoden aufgerufen/abgearbeitet. Ursprung ist die main()-Methode. Jeder Methodenaufruf bedingt gewissen Speicher, insbesondere für ihre aktuellen Parameter und lokalen Variablen. Dazu dient der Call Stack. Ein neuer Methodenaufruf bewirkt, dass der Call Stack wächst bzw. darauf ein zusätzlicher -> Stack Frame angelegt wird.
- Rekursion und Iteration sind gleich mächtig
- D.h. die Menge der berechenbaren Problemstellungen bei Verwendung der Rekursion und Verwendung der Iteration ist gleich.
- D.h. eine rekursive Implementation lässt sich grundsätzlich immer in eine gleichwertige iterative Implementation umprogrammieren und umgekehrt.
(Hinweis: Dies gilt exakt nur für sogenannte primitiv-rekursive Probleme, d.h. bei linearer und nicht geschachtelter Rekursion bzw. bei reinen Zählschleifen)
Welche Motivation haben wir für die Rekursion?
- mächtiges Lösungskonzept
- häufig einfache und elegante Problemlösungen
- weniger Quellcode
- Korrektheit häufig einfacher zu zeigen
- z.B. kennen die Programmiersprachen (Lisp: List Processing, Prolog: Programming in Logic) nur Rekursion!
Was sind Tücken der Rekursion?
- schnell sehr viele Methodenaufrufe
- tendenziell langsamere Programmausführung
- grosser Speicherbedarf auf dem Call Stack
- Gefahr eines Stack Overflow!
Bei Wahlmöglichkeit eine iterative Implementation bevorzugen!
Welche Rekursions-Typen gibt es?
- lineare Rekursion
- nichtlineare Rekursion
- direkte Rekursion
- indirekte Rekursion
Erläutere direkte Rekursion
Eine rekursive Methode ruft sich direkt selbst auf
Beispiel Permutation (Passwort Cracking)
Jemand hat sein Passwort vergessen. Es war sechs Zeichen lang. Im Passwort kamen nur die Buchstaben von A bis F vor und jeder Buchstabe nur einmal. Wie viele verschiedene Passwörter bzw. Buchstaben-Kombinationen muss er/sie durchprobieren?
Mit anderen Worten: Gefragt sind alle Permutationen der Buchstaben A bis F?
Also 6 ・5 ・4 ・3 ・… ・1 = 6! Permuationen
Im Falle von nur drei Buchstaben A, B und C ergeben sich diese Permutationen: ABC, BAC, CBA, BCA, ACB, CAB.
Eine entsprechende Methode soll alle Permutationen ausgeben (siehe Bild)
Wie sieht diese Implementation in Java aus?
Selbstähnlichkeit bzw. Rekursion findet sich bei Algorithmen und __________.
Datenstrukturen
Stimmt diese Aussage?
Iteration und Rekursion sind zentrale aber nicht gleich mächtige Konzepte in der Programmierung.
Nein, sie sind praktisch gleich mächtige Konzepte. Je nach Fall muss entschieden werden, welches Konzept besser geeignet ist.
Stimmt diese Aussage?
Rekursive Lösungen sind häufig elegant und einfach, haben aber ihre Tücken!
Ja
Bei einer rekursiven Methode unterscheidet man zwischen Rekursions-(1)______ und Rekursions-(2)__________ .
(1) Rekursionsbasis
(2) Rekursionsvorschrift
Für was ist die Rekursionsbasis da?
Für den Rekursionsabbruch
Für was ist die Rekursionsvorschrift da?
Beinhaltet die eigentliche Rekursion
Stimmt diese Aussage?
Auf dem Heap werden die Methoden gespeichert bzw. abgearbeitet und auf dem Call Stack werden die Objekte gespeichert.
Nein, es ist genau umgekehrt:
Auf dem Heap werden die Objekte gespeichert und auf dem Call Stack die Methoden gespeichert bzw. abgearbeitet
Was sind Datenstrukturen?
Datenstrukturen werden verwendet, um Mengen von Daten bzw. Objekten effizient zu speichern und verarbeiten zu können
Was versteht man unter Verarbeitung von Mengen von Daten? (Datenstrukturen)
Unter Verarbeitung versteht man Funktionen, wie z.B. alle enthaltenen Daten/Objekte einzeln zu bearbeiten, nach bestimmten Ojekten zu suchen, zu zählen, zu filtern oder nach unterschiedlichen Kriterien zu sortieren etc.
Java bietet für jede Art von Datenstruktur jeweils nur eine Implementation dieser Datenstruktur an.
Java bietet für jede Art von Datenstruktur wiederum verschiedene Implementationen dieser Datenstrukturen an, um den unterschiedlichen Anforderungen gerecht zu werden -> Java Collections Frameworks
Eine universelle Datenstruktur, die alles perfekt kann, gibt es (leider) nicht, wir müssen fallspezifisch auswählen!
Anhand von was (und den teilweise damit eng verbundenen Algorithmen), sollten wir für jeden Anwendungsfall gezielt die geeignetste Datenstruktur auswählen?
Anhand der Eigenschaften der Datenstrukturen
Das Collection Framework besteht aus welchen drei wesentlichen Inhalten?
Interfaces, Implementationen und Algorithmen
Damit die polymorphen Algorithmen und Datenstrukturen des Collection Frameworks mit beliebigen Elementen funktionieren können, benötigen wir ein paar grundlegende Funktionen. Um welche grundlegende Funktionen handelt es sich?
- Für die Suche von Objekten (oder Verhindern von Duplikaten) müssen wir Objekte als «gleich» erkennen können.
- Für die Sortierung müssen wir Objekte vergleichen und als kleiner (<), gleich (=) oder grösser (>) beurteilen können.
Damit die polymorphen Algorithmen und Datenstrukturen des Collection Frameworks mit beliebigen Elementen funktionieren können, benötigen wir ein paar grundlegende Funktionen:
- Für Suche von Objekten müssen wir Objekte als «gleich» erkennen können
- Für Sortierung müssen wir Objekte vergleichen und als kleiner, gleich oder grösser beurteilen
(1) Die Klasse Object definiert deswegen, welche dafür notwendige Methoden?
(2) Welche Interfaces müssen wir deswegen ggf. implementieren?
(1) equals(), hashCode()
(2) Comparable<T> oder Comparator<T>
Was sind die wichtigsten Anforderungen an die Speicherverwaltung?
- soll zuverlässig sein (wertvoller Speicherplatz soll nicht verloren gehen)
- Allokation sollen schnell sein (keine lange Such nach einem in der Grösse passenden Block)
- schnelle Freigabe
- Mit der Zeit entstehen Lücken sowohl durch belegten als auch freien Speicher (Fragmentierung).
- Liegen freie Lücken nebeneinander, sollten diese in der Datenstruktur wieder zusammengefasst werden!
- Gute Frage dazu: Welche Datenstruktur(en) mit welchen spezifischen Eigenschaften (Sortierung, Suche etc.) eignet sich dafür am Besten?
Auswahl und Einsatz von Datenstrukturen in der Speicherverwaltung ist _____ stark von den eingesetzten Algorithmen abhängig.