Abstrakte Datentypen I - Institut für Pervasive Computing

Werbung
J
Übungen zu Algorithmen und Datenstrukturen 2
WS 2011/2012
Dipl.-Ing. Marc Kurz
Institut für Pervasive Computing
Univ.-Prof. Dr. Alois Ferscha
Letzter Abgabetermin: Di. 01.11.2011, 23:59 Uhr
Abgabe: http://www.pervasive.jku.at/Teaching/
Übung 2
Abstrakte Datentypen I
1. Doppelt verkettete Liste
16 Punkte
Einfügeposition
Implementieren Sie den abstrakten Datentyp DoubleLinkedList (doppelt verkettete Liste mit je einem
Dummy-Knoten am Beginn und am Ende der Liste, sowie je einen Zeiger head und tail auf diese Knoten).
Die leere Liste enthält damit zwei Knoten head und tail (siehe Abbildung):
Integer
(25)
Integer
(48)
Integer
(60)
data
data
data
data
next
next
next
next
next
prev
prev
prev
prev
prev
head
DummyElemente
data
tail
Integer
(52)
node
compareTo
data
next
prev
Die Liste soll Elemente vom Typ Comparable speichern. Verwenden Sie beim (aufsteigend) sortierten
Einfügen mittels addSorted die Methode compareTo, um die Elemente miteinander zu vergleichen und
z.B. so die richtige Einfügeposition für einen neuen Knoten zu finden.
Benutzen Sie zur Implementierung exakt die angegebene Schnittstelle (für jede Klasse eine eigene Datei):
public class DoubleLinkedList<T extends Comparable<T>> implements MyList<T> { … }
interface MyList<T extends Comparable<T>> {
int getSize();
//
void addFirst(T val)
//
throws IllegalArgumentException;
void addLast(T val)
//
throws IllegalArgumentException;
void addAll(int index, MyList<T> l)
//
throws IllegalArgumentException;
//
void sort();
//
void addSorted(T val)
//
throws IllegalArgumentException;
//
T removeFirst()
//
throws NoSuchElementException;
T removeLast()
//
throws NoSuchElementException;
boolean remove(T val)
//
throws IllegalArgumentException;
//
void clear();
//
boolean contains(T val)
//
throws IllegalArgumentException;
//
T getFirst()
//
throws NoSuchElementException;
T getLast()
//
throws NoSuchElementException;
T get(int index)
//
throws IllegalArgumentException;
//
void reverse();
//
Object[] toArray();
//
String toString();
//
}
Liefert die Anzahl der Listenelemente (in O(1))
Fügt Element am Anfang der Liste ein
Hängt Element am Ende der Liste an
Fügt alle Elemente der übergebenen Liste an der …
… spezifizierten Indexposition (0<=index<=getSize()) ein
Sortiert Listenelemente in aufsteigender Reihenfolge
Fügt Element aufsteigend sortiert in Liste ein (die Liste …
… muss zuvor gegebenenfalls sortiert werden)
Gibt das erste Listenelement zurück und entfernt es
Gibt das letzte Listenelement zurück und entfernt es
Entfernt das übergebene Elemente von der Liste, und gibt …
… genau dann true zurück wenn es enthalten ist
Entfernt alle Elemente von der Liste (in O(1))
Gibt genau dann true zurück wenn übergebenes Element in …
… der Liste enthalten ist
Gibt das erste Element der Liste zurück
Gibt das letzte Element der Liste zurück
Gibt das Element an der spezifizierten Indexposition …
… (0<=index<getSize()) zurück
Dreht die Liste um (mit Hilfe von Zeigeroperationen)
Liefert eine Array-Repräsentation der Listenelemente
Liefert eine String-Repräsentation der Listenelemente
J
Übungen zu Algorithmen und Datenstrukturen 2
WS 2011/2012
Dipl.-Ing. Marc Kurz
Institut für Pervasive Computing
Univ.-Prof. Dr. Alois Ferscha
Letzter Abgabetermin: Di. 01.11.2011, 23:59 Uhr
Abgabe: http://www.pervasive.jku.at/Teaching/
Übung 2
Verwenden Sie für die Knoten Ihrer Liste die Klasse DLNode:
public class DLNode<T extends Comparable<T>> {
public T data;
public DLNode<T> next;
public DLNode<T> prev;
public DLNode(T data) {
this.data = data;
this.next = null;
this.prev = null;
}
}
//
//
//
//
T muss
Inhalt
Zeiger
Zeiger
Comparable implementieren
des Knotens
auf den nachfolgenden Knoten
auf den vorhergehenden Knoten
Überprüfen Sie grundsätzlich die übergebenen Argumente (null-Objekte dürfen nicht in die Liste eingefügt
werden) und achten Sie auf einen sauberen Programmierstil. Kommentieren Sie jene Programmteile, die nicht
oder nur schwer aus dem Quelltext erschlossen werden können.
Abzugeben sind die Java-Sourcen für die Implementierungen von DoubleLinkedList und DLNode. Sie brauchen
weder das vorgegebene Interface, noch einen Testtreiber oder Ausgaben von Testläufen abgeben; Ihre Klassen
werden von uns getestet! Halten Sie dazu unbedingt die vorgegebene Schnittstelle ein! Das gilt auch für alle
weiteren Übungen.
Ein Java-Tutorial zu Generics finden sie hier:
http://java.sun.com/docs/books/tutorial/extra/generics/index.html
2. Java Collections
2 + 6 Punkte
a)
Lesen Sie sich die Dokumentation des Java Collection Frameworks (speziell zu den Listen) durch (zu
finden unter http://download.oracle.com/javase/6/docs/technotes/guides/collections/index.html) und
beantworten Sie folgende Fragen:
Was ist der Unterschied zwischen einer ArrayList und einer LinkedList?
Bei welchen Operationen (suchen, einfügen/löschen am Anfang, einfügen/löschen am Ende und
sortieren) ist eine ArrayList bzw. LinkedList effizienter? Begründen Sie Ihre Antworten!
b)
Implementieren Sie eine einfach verkettete sortierte Liste unter Zuhilfenahme des Java Collections
Framework, wobei Sie die bestehende Klasse java.util.LinkedList erweitern sollen. Benutzen Sie zur
Implementierung exakt die angegebene Schnittstelle (für jede Klasse eine eigene Datei):
interface MySortedList<T extends Comparable<T>> extends java.util.List<T> {
void sortList(); // Sortiert die Liste aufsteigend
void addSorted(T val); // Fügt Element aufsteigend sortiert in Liste ein
void addSorted(MySortedList<T> subList); // Fügt eine Sub-Liste sortiert ein
}
Implementieren Sie das Interface in folgender Klasse:
public class MySortedLinkedList<T extends Comparable<T>> extends LinkedList<T> implements
MySortedList<T> { … }
Achten Sie auf eine möglichst effiziente Implementierung, indem Sie auf die Eigenheiten der LinkedList
(siehe Dokumentation bzw. Hinweise) Rücksicht nehmen.
Hinweise:
Verwenden Sie wenn möglich die verfügbaren Methoden der Superklasse.
Verwenden Sie für eine effiziente Lösung nicht den Index der Elemente zum Durchlaufen der
Liste (falls nötig), sondern einen geeigneten Iterator (siehe Dokumentation des Collection
Frameworks).
Auch bei diesem Beispiel reicht es, die implementierte Klasse MySortedLinkedList abzugeben.
Testklassen oder das Interface MySortedList sollen nicht in der Abgabe enthalten sein.
Herunterladen