• Keine Ergebnisse gefunden

Algorithmen und Datenstrukturen (WS 2019) Aufgabenblatt 7

N/A
N/A
Protected

Academic year: 2022

Aktie "Algorithmen und Datenstrukturen (WS 2019) Aufgabenblatt 7"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

TU Kaiserslautern – FB Informatik 17.12.2019

Dr. Patrick Michel

Algorithmen und Datenstrukturen (WS 2019) Aufgabenblatt 7

zu bearbeiten bis: 06.01.20 / 08.01.20

Auf diesem Blatt fangen wir an unsere Bibliothek an Standardtypen aufzubauen. Gegeben sind dazu die Schnittstellen derabstrakten Datentypen(ADTs)List,StackundQueue, die wir aus den ¨Ubungen oder der Vorlesung kennen. F¨ur alle ADTs gelten die folgenden Regeln:

• Sind sind parametrisch im TypTihrer enthaltenen Elemente (Java Generics).

• ADT Definitionen (Java Interfaces) liegen im Paketexercise.adt.

• Konkrete Implementierungen (Java Classes) liegen im Paketexercise.adt.impl.

F¨ur Abgaben werden Sie auf diesem Blatt (und in Zukunft) Ihre Implementierungen hochladen (und in Zukunft die von Ihnen zur L¨osung verwendeten Implementierungen), die Schnittstellen sind bereits im System und brauchen nicht hochgeladen zu werden.

Aufgabe 7.1 (ADT - Listen - Praxis)

Den Anfang machen wir mit dem InterfaceList, welches Listen von Elementen repr¨asentiert.

Schauen Sie sich die gegebene Schnittstelle an und vergleichen Sie mit Ihrer ArrayHelper Implementierung von Blatt 03. KopierenSie dann IhreArrayHelperImplementierung in den Ordnerapp/exercise/adt/impl, benennen Sie Datei und Klasse inArrayListum und implementieren Sie dieListSchnittstelle. Der Kopf Ihrer Datei wird dann so aussehen:

package exercise.adt.impl;

import exercise.Exercise;

import exercise.adt.List;

@Exercise

public class ArrayList<T> implements List<T> { private T[] data;

private int next;

...

}

Hinweise zur Implementierung:

• Ersetzen Sie den konkreten TypPersonin der gesamten Datei duch die TypvariableT(wie oben angefangen).

• Um in Java ein Array vom TypT[]der L¨angelenanzulegen k¨onnen Sie folgenden Aus- druck verwenden: (T[]) new Object[len].

Algorithmen und Datenstrukturen (WS 2019) (7) 1/2

(2)

• Entfernen Sie alle Methoden rund um Sortierung und den TypComparator.

• Ersetzen Sie die Implementierung der MethodecheckCapacitydurch die auf Blatt 03 beschriebene, welche beim Erreichen der Kapazit¨at das Array vergr¨oßert, anstatt eine Ex- ception zu werfen.

• Enffernen Sie die Deklaration der beiden Ausnahmen (CapacityReachedException undNoSuchElementException), verwenden Sie die inListbeschriebene Exception.

• Implementieren Sie fehlende Methoden bzw. benennen Sie alte Methoden um, damit sie auf die Schnittstelle vonListpassen.

• Schließlich sollten Sie alle Methoden entfernen, die ein externes Array alsdata¨ubernehmen oder eine Referenz auf das internedataArray nach außen geben.

Ob damit dieListSchnittstelle korrekt implementiert ist k¨onnen Sie wie immer durch Ausf¨uhren der Tests validieren. Stellen Sie sicher, dass Ihre Implementierung mindestens einen Konstruktor ohne Parameter besitzt, so dass die Tests eine Instanz Ihrer Implementierung erzeugen k¨onnen.

Aufgabe 7.2 (ADT - Stacks und Queues - Praxis)

Wir implementieren nun die beiden ADTsStackundQueue, beide mit (theoretisch) unbegren- zter Gr¨oße. Beide Datentypen k¨onnen sehr einfach durchArrayListimplementiert werden.

• Implementieren Sie inArrayListnunzus¨atzlichzuListauch das InterfaceStack.

F¨ugen Sie dazu die neuen Operationen zu der Klasse hinzu und rufen Sie die entsprechend passende Methode vonListauf.

• Implementieren Sie inArrayListnunzus¨atzlichdas InterfaceQueue.

F¨ugen Sie dazu wieder die neuen Operationen zu der Klasse hinzu und rufen Sie jeweils die passende Methode vonListauf.

• Bewerten Sie f¨ur beide Implementierungen wie gut diese sind. Geben Sie dazu jeweils die Komplexit¨aten der Methoden der Interfaces in Ihrer Implementierung an (best/avg/worst).

Aufgabe 7.3 (ADT - Effiziente Queues - Praxis)

Implementieren Sie nun das InterfaceQueueerneut, diesmal in der KlasseDoubleStackQueue.

Die Idee der Klasse soll dabei sein:

• Die Implementierung benutzt zwei private Stacks, einenenqueueStack und einendequeue Stack.

• DieenqueueOperation wird durch einpushauf dem entsprechenden Stack umgesetzt.

• Die dequeueOperation wird durch ein pop auf dem entsprechenden Stack umgesetzt.

Sollte dieser Stack allerdings leer sein, ¨ubertragen Sie zuerst alle Elemente desenqueue Stacks auf dendequeueStack. (Die Elemente werden dabei in der Reihenfolge invertiert.)

• Die Queue ist genau dann leer, wenn beide Stacks leer sind und die Gr¨oße der Queue ist die Summe der Gr¨oßen der beiden Stacks.

Bewerten Sie die G¨ute dieser Implementierung, indem Sie wieder die Komplexit¨aten der Metho- den angeben!

Materialien: https://softech.cs.uni-kl.de/homepage/de/teaching/WS19/algodat

Algorithmen und Datenstrukturen (WS 2019) (7) 2/2

Referenzen

ÄHNLICHE DOKUMENTE

• Insertionsort (Skizzieren Sie das Feld nach jedem Durchlauf der ¨außeren Schleife).. • Selectionsort (Skizzieren Sie das Feld nach jedem Durchlauf der

Um die beste L¨osung f¨ur einen Bereich zu finden, vergleichen Sie drei L¨osungen: (1) die beste L¨osung, die rekur- siv in der linken H¨alfte gefunden wurde, (2) die beste L¨osung,

In der Vorlesung haben Sie eine alternative Implementierung des List Interface gesehen, mit Hilfe von einzelt verketteten Listen ( SingleLinkedList ).. • Annotieren Sie an jede

• Erg¨anzen Sie nun die iterator() Methode f¨ur die Klasse DoubleLinkedList und implementieren sie die gleichen drei Methoden im passenden Iterator?. • Welche Komplexit¨at haben

• Die Methode createRandomPlane(int size, String seed) konstruiert eine zuf¨allige Instanz mit size St¨adten, bei der jede Stadt zuf¨allige Koordinaten auf einer virtuellen

Um sich besser über einen solchen zu unterhalten, gibt es folgende Fachbegriffe:.. 1 Mehr dazu findest du bei http://de.wikipedia.org/wiki/S%C3%A4ugetiere

Sowohl Dateien als auch Ordner sind für den Computer Klassen und haben damit bestimmte und.. Vervollständige daher

Suche einen Knoten entweder mit e.key() &lt; key und linkem Nachfolger null oder mit e.key() &gt; key und rechtem Nachfolger null.. Lösche den Inhalt des