¨Ubungsblatt 4

Werbung
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
Herunterladen