Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10
Algorithmen und Datenstrukturen 10
Stefan Ploner
10. Januar 2012
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10
1 Besprechung Blatt 9 Fragen
2 ADT
Allgemein Beispiele 3 Generics
Type Erasure Generic-Array 4 Datentypen
Einfach verkettete Liste Binary Heaps
5 Vorbereitung Blatt 10 Hinweise
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Fragen
Fragen zu Blatt 9?
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Allgemein
Schema eines ADTs
adt[Name]
sorts[Verwendete Datentypen]
ops
[Methodensignaturen]
axs [Axiome]
end[Name]
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Allgemein
Operationstypen
3 Operationstypen:
1 (Prim¨ar-)Konstruktoren (Operationen zum Erreichen jedes m¨oglichen Zustands, minimale Anzahl)
2 Hilfskonstruktoren (alles andere was den ADT zur¨uckgibt)
3 Projektionen (andere R¨uckgabewerte)
Im Normalfall werden beide ADT-Konstruktorarten in Java mit Java-Konstruktoren abgebildet.
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Allgemein
Prim¨ arkonstruktoren, Normalform
Prim¨arkonstruktoren
• ben¨otigen keine eigenen Axiome
• werden durch die Verwendung in den anderen Operationen definiert
Normalform
• Objekt, das durch eine minimale Zahl von Prim¨arkonstruktoren dargestellt ist.
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Beispiele
STACK: T
ops
create: -> STACK push: T x STACK -> STACK pop: STACK -> STACK top: STACK -> T empty: STACK -> BOOL axs
A1: empty(create()) = TRUE A2: empty(push(x, s)) = FALSE A3: pop(create()) = ERROR A4: pop(push(x, s)) = s A5: top(create()) = ERROR A6: top(push(x, s)) = x
A7: push(top(s), pop(s)) = s falls s != create() push wird bereits ueber die anderen Axiome definiert
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Beispiele
QUEUE: T
ops
create: -> QUEUE enqueue: T x QUEUE -> QUEUE dequeue: QUEUE -> QUEUE head: QUEUE -> T empty: QUEUE -> BOOL axs
A1: empty(create()) = TRUE A2: empty(enqueue(x, q)) = FALSE A3: head(create()) = ERROR
A4: head(enqueue(x, q)) = x falls empty(q) = TRUE
= head(q) sonst A5: dequeue(create()) = ERROR
A6: dequeue(enqueue(x, q)) = q falls empty(q) = TRUE
= enqueue(x, dequeue(q)) sonst % Liste beibehalten!
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Type Erasure
Type Erasure
Generics werden in Java durch “Type Erasure” umgesetzt. Dabei passiert beim Kompilieren im Prinzip folgendes:
• alle T-Variablen werden durch den Typ Object ersetzt
• an allen Stellen, wo außerhalb der Klasse der Parametertyp (T) verwendet wird, werden entsprechende Casts hinzugef¨ugt
• die Casts werden dabei gepr¨uft, wodurch ClassCastExceptions zur Runtime verhindert werden
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Type Erasure
Type Erasure
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(5);
int value = list.get(5);
Nach Type Erasure:
ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
int value = (Integer)list.get(5);
Nach dem Kompilieren wird trotz unterschiedlichen Typparametern die selbe Klasse verwendet. Die Werte der Typparameter sind zur Laufzeit nicht mehr bekannt.
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Type Erasure
Folgen von Type Erasure:
• statische Variablen und Methoden werden geteilt
• entsprechend k¨onnen diese keine generischen Typen enthalten
• die Bedingung “obj instanceof T” ist nicht m¨oglich
• auf generischen Typen sind keine Konstruktor-Aufrufe und nur Methodenaufrufe des Basistyps (object) m¨oglich
Es k¨onnen auch keine Arrays eines gen. Typs angelegt werden.
Als Workarround kann man einObject[]-Array verwenden, jedoch m¨ussen dann intern Casts nach T hinzugef¨ugt werden. (→Beispiel)
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Generic-Array
Zeit f¨ur ein Beispiel!
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Generic-Array
public class Array<T> implements Comparable<Array<T>> { private Object[] array;
public Array(int n) { array = new Object[n];
}
@SuppressWarnings("unchecked") public T get(int i) {
return (T)array[i]; // Cast von Object nach T }
public void set(int i, T o) { array[i] = o;
}
// vergleicht nur die Laengen, nicht die Elemente!
public int compareTo(Array<T> other) {
return array.length - other.array.length;
} }
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Einfach verkettete Liste
Einfach verkettete Liste
Listenelemente bestehen aus
• Wert (Referenz oder Werttyp selbst)
• Referenz zum n¨achsten Element Listenklasse besteht aus
• Referenz zum ersten Listenelement oder Sentinel
• Optional: Variable zum Mitz¨ahlen der Elementanzahl beim Hinzuf¨ugen / Entfernen (spart sp¨ateres nachz¨ahlen)
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Binary Heaps
Binary Heaps
• Baumstruktur
• Vaterelement immer kleiner / gr¨oßer als beide Kinder
• immer balanciert (im Gegensatz zu Suchb¨aumen) Mit Heaps k¨onnen Vorrangwarteschlangen (priority-queues) effizient umgesetzt werden, da das Element mit der h¨ochsten Priorit¨at schnell gefunden wird.
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Binary Heaps
Einf¨ ugen in einen Max-Heap
• neues Element hinten an den Heap anh¨angen
• solange das Vaterelement kleiner ist, neues Element mit dem Vaterelement tauschen (Hochblubbern)
Achtung: Bevor man auf Vater- oder Kindelemente zugreift, muss man pr¨ufen, ob diese auch existieren!
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Binary Heaps
Herausnehmen aus einem Max-Heap
• gew¨unschtes Element aus dem Heap nehmen
• hinterstes Element an die freie Stelle verschieben
• wenn das Vaterelement kleiner ist
• solange das Vaterelement kleiner ist, tausche das Element mit dem Vaterelement (Hochblubbern)
sonst
• solange das gr¨oßere Kindelement gr¨oßer ist, tausche mit diesem (Versickern)
Bemerkung: Die if-else-Bedingung dient nur der ¨Ubersicht und ist eigentlich ¨uberfl¨ussig, da sich die Schleifen bereits ausschließen.
Beim f¨ur einen Heap ¨ublichen Entfernen des Wurzelelements kann nat¨urlich nur der Versickern-Fall eintreten.
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Hinweise
Compiler-Warnungen bei Generics
Befehl zum Anzeigen der Warnungen:
javac -Xlint:unchecked filename.java
Nicht alle Warnungen k¨onnen behoben werden. (Generic Array-Creation, Cast eines Object-Arrayelements in den Generic-Type)
Andere sollten behoben werden (fehlende Typparameter) Warnungen k¨onnen per @SuppressWarnings(“unchecked”) vor Variablen-, Methoden- und Klassendeklarationen f¨ur den entsprechenden Bereich unterdr¨uckt werden. Der Bereich sollte immer minimal gew¨ahlt werden (nie auf die gesamte Klasse).2
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Hinweise
10.2 Umgekehrte polnische Notation
Fragen?
Algorithmen und Datenstrukturen 10 Stefan Ploner
Besprechung Blatt 9 ADT Generics Datentypen Vorbereitung Blatt 10 Hinweise
10.4 MergedLinkedList
• W¨achterelement optional, evtl. einfacher
• MergedLinkedListTest.java nutzen!
Algorithmen und Datenstrukturen 10 Stefan Ploner