Übungen zu Algorithmen und Datenstrukturen II WS 2003/2004 ...
Übungen zu Algorithmen und Datenstrukturen II WS 2003/2004 ...
Übungen zu Algorithmen und Datenstrukturen II WS 2003/2004 ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Mag. Thomas Hilpold<br />
Institut für Wirtschaftsinformatik<br />
Software Engineering<br />
<strong>Übungen</strong> <strong>zu</strong> <strong>Algorithmen</strong> <strong>und</strong> <strong>Datenstrukturen</strong> <strong>II</strong><br />
<strong>WS</strong> <strong>2003</strong>/<strong>2004</strong><br />
Übung 2<br />
Name:________________________________Matr.-Nr.:________________Punkte:______<br />
Gruppe: r G1 (15:30-16:15) r G2 (16:15-17:00)<br />
Letzter Abgabetermin: Mi., 19.November 10:00 Uhr<br />
Tutor-Kurzzeichen:<br />
Übung 2: Graphen<br />
Gesucht sind <strong>Algorithmen</strong> <strong>zu</strong>r Verwaltung von ungerichteten gewichteten Graphen. Die Knoten sind<br />
durchnummeriert. Jedem Knoten ist eine Bezeichnung (Zeichenkette) <strong>zu</strong>geordnet. Für die alle<br />
Kantenbewertungen w gilt, w >= 0.<br />
Aufgabe 1: Adjazenzmatrix<br />
Vervollständigen sie folgende Adjazenzmatrix (Flugnetz einer kleinen Fluglinie):<br />
2 Punkte<br />
London<br />
340<br />
Paris<br />
930<br />
880<br />
1030<br />
Berlin<br />
520<br />
Wien<br />
1<br />
1<br />
(London<br />
)<br />
Adjazenzmatrix<br />
2<br />
(Berlin)<br />
3<br />
(Wien)<br />
4<br />
(Rom)<br />
5<br />
(Paris)<br />
1120<br />
770<br />
2<br />
3<br />
Rom<br />
4<br />
5<br />
Aufgabe 2: Tiefen- <strong>und</strong> Breitensuche<br />
12 Punkte<br />
Gesucht sind zwei in Java programmierte <strong>Algorithmen</strong> für die rekursive Tiefensuche <strong>und</strong> die nicht<br />
rekursive Breitensuche. Die Knoten sollen in der Reihenfolge, in der sie besucht werden, in eine<br />
<strong>zu</strong>rück<strong>zu</strong>gebende Adjazenzmatrix eingefügt werden. Die Traversierung wird ausgehend von einem<br />
gegebenen Knoten gestartet, sodaß nicht zwingend alle Knoten besucht werden (falls Graph nicht<br />
<strong>zu</strong>sammenhängend).<br />
/**führt eine rekursive Tiefensuche ausgehend vom Knoten start durch;<br />
* liefert neuen Graph mit den besuchten Knoten <strong>und</strong> den durchwanderten Kanten<br />
*/<br />
AdjMatrix depthFirstSearch(Node start);<br />
/**führt eine nicht rekursive Breitensuche ausgehend vom Knoten start durch;<br />
* liefert neuen Graph mit den besuchten Knoten <strong>und</strong> den durchwanderten Kanten<br />
*/<br />
AdjMatrix breadthFirstSearch(Node start);<br />
Verwenden Sie für die Breitensuche den Typ Queue <strong>zu</strong>r Verwaltung von Warteschlangen.<br />
type Queue = {<br />
enqueue(int v)<br />
int dequeue()<br />
/**fügt ein neues Element ein am Ende der Warteschlange ein*/<br />
/**liefert das erste Element in Warteschlange*/
}<br />
boolean isEmpty() /**ist die Warteschlagen leer?*/<br />
Implementieren <strong>und</strong> testen Sie die <strong>Algorithmen</strong>.<br />
Aufgabe 3: Kürzester Pfad<br />
10 Punkte<br />
Der kürzeste Pfad zwischen zwei Knoten from <strong>und</strong> to ist jener Pfad, dessen Summe der Kanntengewichte<br />
kleiner ist als die Summe der Gewichte aller anderen Pfade.<br />
Ein kürzester Pfad lässt sich finden, indem man ausgehend von einem Wurzelknoten (from) jeweils<br />
einen noch nicht im Baum enthaltenen Knoten aus dem Graphen hin<strong>zu</strong>fügt, der den kleinsten Abstand<br />
<strong>zu</strong>m Ausgangsknoten (from) hat. Dies wird solange durchgeführt, bis man den Endknoten (to)<br />
erreicht hat.<br />
- Kürzester Pfad: jener Knoten wird dem Baum hin<strong>zu</strong>gefügt, der den kleinsten Abstand <strong>zu</strong>m<br />
Startknoten hat. Endekriterium: Erreichen des Endknotens.<br />
a) Kürzesten Pfad einzeichnen 2 Punkte<br />
Zeichnen Sie in folgende Graphen je einen kürzesten Pfad von Wien nach London bzw. von London<br />
nach Rom ein.<br />
Kürzester Pfad von Wien nach London<br />
Kürzester Pfad von London nach Rom<br />
London<br />
340<br />
Paris<br />
930<br />
880<br />
Berlin<br />
520<br />
London<br />
340<br />
Paris<br />
930<br />
880<br />
Berlin<br />
520<br />
1030<br />
Wien<br />
1030<br />
Wien<br />
1120<br />
770<br />
1120<br />
770<br />
Rom<br />
Rom<br />
b) Kürzesten Pfad in neuem Graph speichern 8 Punkte<br />
Implementieren Sie einen Algorithmus in Java <strong>zu</strong>r Bestimmung von kürzesten Pfaden, wobei das<br />
Ergebnis nicht ausgedruckt, sondern in einem neuen Graphen abgelegt <strong>und</strong> <strong>zu</strong>rückgeliefert wird.<br />
/**Liefert einen Graph, der einen kürzesten Pfad zwischen zwei Knoten enthält.<br />
* @param from Ausgangspunkt des <strong>zu</strong> suchendenden kürzesten Pfades<br />
* @param to Endpunkt des <strong>zu</strong> suchendenden kürzesten Pfades<br />
* @return kürzester Pfad als Graph<br />
*/<br />
AdjMatrix getShortestPath(Node from, Node to);<br />
Das Ergebnis kann später ausgedruckt werden. Sie können da<strong>zu</strong> die <strong>zu</strong>r Verfügung gestellte Testumgebung<br />
verwenden.<br />
Hinweise <strong>zu</strong> Aufgabe 2 <strong>und</strong> 3:<br />
Gegeben ist die Klasse AdjMatrix mit Methoden <strong>zu</strong>r Verwaltung von ungerichteten, gewichteten<br />
Graphen (Adjazenzmatrix). Es werden Knoten vom Typ Node verwaltet.<br />
class AdjMatrix {<br />
2
int [][] m; /**Adjazenzmatrix*/<br />
int maxNrNodes; /**maximale Anzahl von Knoten*/<br />
Node[] node; /**Knoten des Graphen*/<br />
int nrNodes; /**aktuelle Anzahl von Knoten*/<br />
/**erzeugt <strong>und</strong> initialisiert <strong>Datenstrukturen</strong> für maxNrOfNodes Knoten */<br />
Graph(int maxNrOfNodes)<br />
/**fügt eine Kante vom Knoten (from) <strong>zu</strong>m Knoten (to) ein */<br />
void insertEdge(Node from, Node to, int weight)<br />
/**löscht die Kante vom Knoten (from) <strong>zu</strong>m Knoten (to) aus dem Graph */<br />
void deleteEdge(Node from, Node to)<br />
/**fügt einen neuen Knoten hin<strong>zu</strong> */<br />
void addNode(Node node)<br />
/**liefert das Gewicht der Kanten zwischen den Knoten from <strong>und</strong> to */<br />
int getWeight(int Node, Node to);<br />
/**liefert textuelle Darstellung des Graphen */<br />
String toString();<br />
}<br />
...<br />
class Node {<br />
/**initialisiert einen Konten mit Namen name*/<br />
Node(String name)<br />
}<br />
/**liefert den Namen des Knotens*/<br />
String getName()<br />
Als Beispiel kann Ihnen die Methode getNeighbours(...) dienen. Sie zeigt, wie die <strong>zu</strong>rück<strong>zu</strong>gebende<br />
Adjazenzmatrix aufgebaut werden soll.<br />
3
Testumgebung:<br />
Am Webserver ist eine Testumgebung verfügbar, damit Sie Ihre Arbeiten auf die gesuchten<br />
<strong>Algorithmen</strong> konzentrieren können. Die Testumgebung besteht aus folgenden Klassen:<br />
- Test.java: enthält das Hauptprogramm, soll verändert werden <strong>und</strong> ihre Testfälle enthalten<br />
(Dialog nicht unbedingt nötig).<br />
- AdjMatrix.java: Graph, fügen Sie hier (<strong>und</strong> nur hier!) ihren Code ein<br />
- Node.java: Knotenbeschreibungen<br />
- Queue.java: Warteschlange<br />
- RandomNumbers.java: Zufallszahlen für die Erzeugung von Testfällen<br />
In der Klasse AdjMatrix sind bereits die in den Aufgaben 2 <strong>und</strong> 3 gesuchten Methoden enthalten.<br />
Allerdings liefern sie nur beispielhafte Ergebnisse, die ausgegeben werden können.<br />
Abgabe:<br />
Ab<strong>zu</strong>geben sind:<br />
- die Klasse AdjMatrix mit den Methoden depthFirstSearch, breadthFirstSearch,<br />
getShortestPath, sowie weiteren Hilfsmethoden <strong>und</strong>/oder Hilfsvariablen,<br />
- aussagekräftige Testausgabe.<br />
4