07.09.2014 Aufrufe

Ü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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!