Fachbereich Informatik & Mathematik (12) Professur Graphische Datenverarbeitung Prof. Dr. Detlef Krömker Jörg Demmer Ashraf Abu Baker Robert-Mayer-Str. 10 60325 Frankfurt am Main Tel.: +49 (0)69 798-24610 Fax: +49 (0)69 798-24603 E-Mail: jdemmer@gdv.cs.uni-frankfurt.de baker@gdv.cs.uni-frankfurt.de Ausgabe: 22.11.2006 Abgabe: 01.12.2006 Vorlesung PRG-1, WS 06/07 6. Übung Zur Beachtung: Ab diesem Übungsblatt müssen Lösungen zu Programmieraufgaben getippt und per E-Mail beim Tutor abgegeben werden. Handgeschriebener Quellcode wird nicht mehr akzeptiert! Aufgabe 6.1: Binäre Suchbäume (2 Punkte) Ein binärer Suchbaum ist ein binärer Baum, bei dem Knoten mit kleineren Schlüsselwerten immer links und Knoten mit größeren Werten immer rechts eines Vorgängerknotens eingefügt werden. Beispielsweise ist der folgende Baum ein binärer Suchbaum: 5 3 7 2 4 6 Zeichnen Sie den binären Suchbaum, der entsteht, wenn die folgenden Eingabefolgen eingegeben werden: (a) 15, 6, 10, 25, 12, 3, 18, 1, 4, 30, 20, 16, 32, 8 (0,5 Punkte) (b) 1, 3, 4, 6, 8, 10, 12, 15, 16, 18, 20, 25, 30, 32 (0,5 Punkte) (c) Wenn ein Baum aufgebaut ist wie Baum (a) und n Knoten hat, wie lange müssen Sie im schlimmsten Fall suchen, um in diesem Baum einen Knoten zu finden oder zu wissen, dass er nicht existiert? Wie ist es beim Baum (b)? (1 Punkt)
Aufgabe 6.2: Graphen (3 Punkte) Gegeben sei der folgende Graph: a 1 b 3 4 c e d 7 8 f 2 g h 5 6 Stellen Sie diesen Graphen dar: (a) in einer Adjazenzmatrix (1 Punkt) (b) in einer Inzidenzmatrix (1 Punkt) (c) in einer Adjazenzliste (1 Punkt)
Aufgabe 6.3: Lerngruppenaufgabe: UML (5 Punkte) Tipp: UML wird im Reading Nr. 5 zur Vorlesung behandelt: http://www.gdv.informatik.unifrankfurt.de/lehre/ws2006/prg-1/readings/guenther-wahl-uml-kompakt.pdf (a) Erläutern Sie kurz in eigenen Worten die Begriffe Aggregation, Assoziation und Komposition. Nennen Sie für jeden Begriff ein Beispiel, wie die entsprechende Beziehung zur Anwendung kommen kann. (1 Punkt) (b) Sie sollen für eine Einzelhandelskette ein Warenwirtschaftssystem programmieren, in dem Dinge wie Einkauf, Verkauf, Lagerhaltung, Logistik und Buchhaltung enthalten sind. Überlegen Sie sich Anwendungsfälle für ein solches System und stellen Sie sie in einem Use-Case-Diagramm in UML dar. (2 Punkte) (c) Erstellen Sie ein Klassendiagramm in UML aus dem folgenden Python-Code (2 Punkte): class aba: def init (self, a, b): self. a = a self.b = b def geta(self): return self. a def calc(self): return self. a + self.b class bcb(aba): def init (self, a, b): aba. init (self, a, b) def donothing(self, x): print "Really did nothing with " + str(x) class xyz: def init (self, x): # Prüft, ob x eine Instanz der Klasse bcb ist if isinstance(x, bcb): self. x = x else: self. x = None self.z = self.zzz() def donothingwithbcb(self, x): self. x.donothing(x) class zzz: def init (self): pass def helloword(self): print "Hello, world!"
Aufgabe 6.4: Bonusaufgabe: Bellman-Ford-Algorithmus (3 Punkte) In vielen Anwendungsbereichen (z.b. Logistik) ergibt sich die Notwendigkeit, in einem kantengewichteten Graphen kürzeste Wege von einem Knoten A zu einem Knoten B ermitteln zu können. Beispielsweise könnte man ein Wegenetz in einem solchen Graphen repräsentieren: K0 Hamburg 290 420 490 K3 Berlin K1 Köln 190 K2 Frankfurt 540 200 390 K4 Stuttgart 220 K5 München Kürzester Weg von Hamburg nach München? Wenn der Graph keine Zyklen mit negativer Länge enthält 1 und die Knoten mit zunehmender Tiefe fortlaufend nummeriert sind, kann zur Lösung dieses Problems der (vereinfachte) Algorithmus von Bellman-Ford verwendet werden. Der Algorithmus findet den kürzesten Weg, indem iterativ ein Baum mit dem Startknoten als Wurzel konstruiert wird, in dem die Weglängen zu den einzelnen Knoten gespeichert sind. Jedem Knoten n des Baumes wird dabei die bislang zurückgelegte Weglänge I(n) zugeordnet und eine Markierung, ob der Knoten gestrichen ist oder nicht. Vorgehensweise: 1) Der Startknoten sei i 0. Setze I(i 0) = 0. Dann ist B der Baum, der nur aus dem Knoten i 0 besteht, und die bislang zurückgelegte Wegstrecke ist natürlich 0. 1 Wäre z.b. der Fall, wenn der Graph eine Kante Frankfurt-Hamburg mit Wert -1000 enthielte. Dann könnte man eine Rundreise Hamburg-Köln-Frankfurt-Hamburg machen und dabei eine negative Zahl von Kilometern zurücklegen. In dem Fall funktioniert der hier vorgestellte Algorithmus nicht.
2) Wenn die Blätter von B keine unmittelbaren Nachfolger im Graphen mehr besitzen oder nur noch Nachfolger, die in B bereits gestrichen worden sind, beende die Verarbeitung. Sonst fahre fort mit Schritt 3. 3) Von einem Blatt i mit kleinster Tiefe (bei fortlaufender Nummerierung: Mit kleinster Knotennummer), das nicht ausschließlich gestrichene unmittelbare Nachfolger in B besitzt, betrachte in beliebiger Reihenfolge alle unmittelbaren Nachfolger j im Graphen. o Wenn j noch nicht in B enthalten ist, füge j in B als unmittelbaren Nachfolger von i hinzu und setze für die Wegstrecke I(j) = I(i) + c ij (das Gewicht, mit dem die Kante zwischen i und j versehen ist). o Wenn j schon in B enthalten ist und es gilt I(i) + c ij < I(j), dann markiere den vorhandenen Knoten j und sämtliche Nachfolger als gestrichen. Füge j als Nachfolger von i in den Baum ein und setze I(j) = I(i) + c ij. o Wenn j schon in B enthalten ist und es gilt I(i) + c ij > I(j), füge ihn als gestrichenen Nachfolger in den Baum ein. o Wenn j schon in B enthalten ist und es gilt I(i) + c ij = I(j), dann füge in B j als Nachfolger von i hinzu, sofern j nicht schon auf dem Weg von 0 i nach i vorhanden ist, und setze I(j) = I(i) + c ij ; sonst füge j als gestrichenen Nachfolger ein. 4) Gehe zu Schritt 2, wenn alle unmittelbaren Nachfolger von i bearbeitet worden sind. (a) Wenden Sie das Verfahren an, um den kürzesten Weg von K0 nach K5 zu finden, und zeichnen Sie den konstruierten Wegebaum. (1 Punkt) (b) Implementieren Sie den Algorithmus in Python, und speichern Sie den Graphen und den zu konstruierenden Baum in einer geeigneten Datenstruktur. (2 Punkte) Hinweis: Die maximal erreichbare Punktzahl für dieses Übungsblatt beträgt 10 Punkte. Die Bonusaufgabe ist eine Möglichkeit, Punktverluste aus den anderen Aufgaben auszugleichen.