Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen 186.813 Algorithmen und Datenstrukturen 1 VU 6.0 Übungsblatt 4 für die Übung am Montag den 19. bzw. Dienstag den 20. Mai 2014. Kreuzen Sie bis spätestens Sonntag, 18.05.2014, 23:59 Uhr über TUWEL an, welche Beispiele Sie bearbeitet und gelöst haben. Gehen Sie dabei folgendermaßen vor: • TUWEL (https://tuwel.tuwien.ac.at) Kurs 186.813 Algorithmen und Datenstrukturen 1 (VU 6.0) • Thema 4. Übungsblatt Link 4. UE - Details & Bewertung • Button Meine Lösung bearbeiten Bearbeitete Beispiele anhaken und Änderungen speichern. Bitte beachten Sie: • Sie können vor der Deadline beliebig oft ihre Auswahl an Beispielen verändern, aber nach der Deadline gibt es keine Veränderung ihrer angekreuzten Beispiele! • Wenn Sie zur Präsentation Ihrer Lösung eines von Ihnen angekreuzten Beispiels ausgewählt werden und dieses aber nicht bearbeitet haben, verlieren Sie alle Punkte dieser Übungseinheit! Aufgabe 31 (a) Es sollen durchschnittlich 500 000 Einträge in einer Hashtabelle gespeichert werden. Sie wissen, dass es kurzzeitig zu Spitzen von bis zu drei Millionen Einträgen kommen kann. Da dies nur selten passiert, wurde aus Speichereffizienz-Gründen die Tabellengröße m = 606077 gewählt. Welche Schritte sind notwendig, wenn die Anzahl der zu speichernden Elemente die Tabellengröße übersteigt, wenn Sie als Kollisionsbehandlung • Verkettung der Überläufer, • Lineares Sondieren, bzw. • Double Hashing mit der Verbesserung nach Brent verwenden? (b) Es sollen maximal 20 000 Elemente in einer Hashtabelle gespeichert werden. Der Speicherverbrauch der Tabelle sowie die Zugriffszeit beim Suchen sollte jeweils so gering wie möglich gehalten werden. Wie würden Sie unter diesen Voraussetzungen die Hashtabelle realisieren? Aufgabe 32 Gegeben sei die Zahlenfolge h21, 9, 32, 14, 7, 17, 31, 12, 5, 25, 6i und die beiden Hashfunktionen h1 (k) = k mod 17 h2 (k) = (k mod 5) + 1 Fügen Sie die Elemente der Folge mit Hilfe von Double Hashing mit der Verbesserung nach Brent in eine Hashtabelle der Größe m = 11 ein. Es muss für jede Zahl erkenntlich sein, wie sie zu ihrem endgültigen Platz in der Hashtabelle gekommen ist. Aufgabe 33 Gegeben ist der folgende ungerichtete Graph G = (V, E): • Knoten V = {a, b, c, d, e} • Kanten E = {(a, b), (a, c), (b, e), (c, e), (c, d), (d, e)} (a) Zeichnen Sie den Graphen. (b) Stellen Sie diesen einerseits mittels Adjazenzlisten, andererseits mit Hilfe einer Adjazenzmatrix dar. 2 (c) Ist der Graph ein Baum? Wenn nicht, geben Sie alle seine Zyklen an. (d) Auf dem gegebenen Graphen wird die aus dem Skriptum bekannte Tiefensuche durchgeführt. Welche der folgenden Listen von besuchten Knoten können dabei in genau dieser Reihenfolge entstehen? Hinweis: Die Nachbarn eines Knotens können in beliebiger Reihenfolge abgearbeitet werden. Reihenfolge baced ecdba dceab abeca cdeab cdeba Tiefensuche Aufgabe 34 Führen Sie auf dem untenstehenden Graphen den TiefensucheAlgorithmus zur Kreissuche in einem Graphen aus (Algorithmus Depth-First-Search3 aus dem Skriptum). Verwenden Sie den Knoten 1 als Startknoten. Die Nachbarn eines Knotens werden immer in aufsteigend sortierter Reihenfolge betrachtet. Geben Sie an, in welcher Reihenfolge die Knoten besucht werden und welche Kreise der Algorithmus findet. Geben Sie einen beliebigen Kreis des Graphen an, der vom Algorithmus nicht gefunden wird. 1 3 2 5 7 4 6 Aufgabe 35 Breitensuche ist ein Verfahren zum Durchsuchen bzw. Durchlaufen von Knoten eines Graphen ähnlich der in der Vorlesung behandelten Tiefensuche. Auch hier geht man von einem Startknoten u aus, allerdings unterscheiden sich Tiefen- und Breitensuche hinsichtlich der Reihenfolge, in der weitere Knoten des Graphen abgearbeitet bzw. besucht werden. Wir gehen im Folgenden von einem ungerichteten Graphen aus. Beginnend mit dem Startknoten u werden bei der Breitensuche zunächst alle zu u adjazenten Knoten besucht, d.h. alle Knoten v, für die eine Kante (u, v) im Graphen existiert; 3 zusätzlich werden alle diese Knoten v in einer Warteschlange gespeichert. Die Breitensuche bearbeitet also zuerst immer alle direkt benachbarten Knoten und folgt nicht – wie die Tiefensuche – gleich einem Pfad in die Tiefe. Nachdem nun alle adjazenten Knoten von u betrachtet wurden, wird der erste Knoten der Warteschlange entnommen und für diesen das Verfahren wiederholt. Dies wird nun so lange fortgesetzt, bis entweder die Warteschlange leer ist oder bis – wenn man nach einem bestimmten Knoten sucht – dieser gefunden wurde. Wie auch bei der Tiefensuche werden durch Markieren bereits bearbeiteter Knoten Mehrfachbesuche verhindert. Gegeben sei nun die Datenstruktur Queue (Warteschlange), welche eine beliebige Menge an Objekten aufnehmen kann und diese gemäß der Reihenfolge ihres Einfügens zurück liefert. Folgende Operationen werden von einer Queue Q zur Verfügung gestellt: • Q.isEmpty(): Liefert true zurück, falls die Queue Q keine Elemente enthält, und false sonst. • Q.put(x): Fügt das Element x der Queue Q hinzu. • Q.get(): Entfernt das älteste Element in der Queue Q und liefert dieses zurück. Benutzen Sie die Queue, um eine nicht-rekursive Version der Breitensuche zu entwerfen. Beschreiben Sie erst in wenigen Worten den Ablauf Ihres Algorithmus und geben Sie diesen dann in Pseudocode an. Die Queue können Sie dabei als Black Box“ betrachten, ” d.h., Sie können sie benutzen, ohne die genaue Funktionsweise explizit als Pseudocode ausarbeiten zu müssen. Aufgabe 36 Gegeben sind zwei Graphen G1 und G2 mit jeweils einer Million Knoten. Graph G1 hat vier Millionen Kanten, während G2 250 Milliarden Kanten hat. Die Kanten in beiden Graphen haben ganzzahlige Kosten. Sie wollen nun in beiden Graphen jeweils einen aufspannenden Baum mit minimalen Kosten berechnen. Welchen Algorithmus benutzen Sie für G1 und welchen für G2 , um möglichst niedrige Laufzeiten zu erreichen? Begründen Sie Ihre Antwort, indem Sie die Laufzeiten der von Ihnen verwendeten Algorithmen in Θ-Notation (in Abhängigkeit von |E| bzw. |V |) angeben. Geben Sie weiters an, warum die Algorithmen die von Ihnen angegebenen Laufzeiten aufweisen (kurze Beschreibung der Algorithmen und der Funktionsweise und Eigenschaften der verwendeten Datenstrukturen). 4 Aufgabe 37 Für einen Test aus Algorithmen und Datenstrukturen“ soll durch die Er” stellung mehrerer unterschiedlicher aber gleichwertiger Beispielgruppen das Abschreiben vom Nachbarn möglichst verhindert werden. Der Sitzplan eines Hörsaals wird als Graph G = (V, E) realisiert. Dabei entspricht jeder Knoten aus V einer Person mit einem Angabeblatt, und jede Kante aus E verbindet jeweils zwei direkt benachbart (z.B. in einem Radius von maximal 2,5 Metern) sitzende Personen. Nun muss jeder Person eine Beispielgruppe (A, B, C, . . . ) so zugeordnet werden, dass an keiner Stelle des Hörsaals zwei Personen mit der gleichen Gruppe direkt benachbart sitzen. Die Erstellung zusätzlicher Beispielgruppen verursacht natürlich auch entsprechend mehr Arbeit. Daher ist das Ziel, mit möglichst wenigen Beispielgruppen auszukommen. Schreiben Sie eine Greedy-Heuristik in ausführlichem Pseudocode, der die oben beschriebene Aufgabe für einen gegebenen Sitzplangraphen G mit Hilfe eines aus der Vorlesung bekannten Verfahrens möglichst gut löst. Hinweis: Diese Optimierungsaufgabe entspricht dem sogenannten Graphenfärbeproblem, welches NP-schwierig ist. Sie sollen deshalb keinen Algorithmus entwickeln, der jede Instanz exakt löst, sondern eine Heuristik, die eine plausible Näherung der Optimallösung liefert. Aufgabe 38 Nach einem großen Osterfest sitzen Sie auf einem Berg von Süßigkeiten. Da Sie diesen nicht selbst abbauen wollen, entschließen Sie sich, einen Teil davon zu Ihrem nächsten Treffen mit Freunden mitzunehmen. Ihre Freunde machen jedoch gerade Diät, weshalb Sie nicht mehr als 15 Fetteinheiten in Form von Süßem essen wollen. Welche Süßigkeiten nehmen Sie mit, um trotz der Fett-Begrenzung den höchsten Genuss zu erzielen? Lösen Sie das Problem mittels vollständiger Enumeration und geben sie den Enumerationsbaum mit allen generierten Lösungen an. i 1 2 3 4 Nahrungsmittel Mölka-Hase Leindt-Hase Osterei Schokobananen enthaltenes GenussFett fi faktor ci 3 10 4 7 2 4 7 5 5 Aufgabe 39 Wenden Sie den Algorithmus von Dijkstra auf den folgenden Graphen an um den kürzesten Weg vom Startknoten A zum Zielknoten H zu finden, Die Kantenbeschriftungen entsprechen den Distanzen zwischen den verbundenen Knoten. • Geben Sie in jedem Schritt die Inhalte der Arrays pred (Vorgänger) und dist (Distanz) für jeden Knoten in der untenstehenden Tabelle an. Füllen Sie jede Spalte der Tabelle vollständig aus. Schritt 1 ist dabei die Initialisierung von A. • Geben Sie anschließend den kürzesten Weg (die einzelnen Kanten sowie die Gesamtlänge) vom Startknoten A zum Zielknoten H an. 6 B 1 1 3 5 A E 4 6 C H 2 3 2 D 2 F 1 G E ∞ undef F ∞ undef 4 Schritt A dist ∞ 0 pred undef dist 1 pred dist 2 pred dist 3 pred dist 4 pred dist 5 pred dist 6 pred dist 7 pred dist 8 pred B ∞ undef C ∞ undef D ∞ undef 6 G ∞ undef H ∞ undef Aufgabe 40 Sie bereiten sich auf eine bevorstehende Reise vor und möchten deshalb die unten angeführten Gegenstände in ihren Koffer einpacken. Jeder dieser Gegenstände hat ein bestimmtes Gewicht und einen bestimmten Wert. Leider dürfen Sie nur maximal 10 kg Gepäck mitnehmen. Welche Gegenstände packen Sie ein, um einen möglichst hohen Gesamtwert zu erhalten? Lösen Sie das Problem mit Hilfe dynamischer Programmierung und einer (n + 1) × (K + 1) Matrix m, wobei K = 10 das Maximalgewicht ist und der Eintrag im Feld mi,j angibt, welcher Gesamtwert aus den ersten i Elementen erreicht werden kann, wenn das Gesamtgewicht der gewählten Gegenstände kleiner oder gleich j ist. Gesucht ist eine nicht leere Auswahl der Gegenstände, sodass der Gesamtwert der ausgewählten Elemente möglichst groß ist, ohne das Maximalgewicht K zu überschreiten. Die Felder der Matrix können wie folgt rekursiv berechnet werden: m0,j = 0 mi,0 = 0 mi,j = max {mi−1,j−wi + ci , mi−1,j } für j = 1, . . . , K für i = 0, . . . , n für i = 1, . . . , n, j = 1, . . . , K • Ergänzen Sie die unten stehende Matrix (die Initialisierung wurde schon entsprechend vorgenommen). • Geben Sie eine optimale Lösung mit Hilfe dieser Matrix an. Markieren Sie alle Felder der Matrix, die beim Zurückrechnen der konkreten Auswahl von Relevanz sind. (Das Suchen des Ausgangspunktes muss nicht brücksichtigt werden.) Gegenstand i 1 2 3 4 5 6 7 8 Gewicht (in kg) wi 2 2 2 6 3 10 11 3 7 Wert (Kosten) ci 4 5 10 19 16 19 31 3 i\j 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 3 0 4 0 5 0 8 6 0 7 0 8 0 9 0 10 0