Sie sind auf Seite 1von 3

Übungen zur Vorlesung

Algorithmen und Datenstrukturen


Übungsblatt 11

Arbeitsgruppe Kryptographie und Komplexitätstheorie


Prof. Dr. Marc Fischlin Sommersemester 2020
Dr. Christian Janson Veröffentlicht: 03.07.2020, 14:00 Uhr MESZ
Patrick Harasser
Felix Rohrbach

P1 (Gruppendiskussion)
Nehmen Sie sich etwas Zeit, um die folgenden Fachbegriffe in einer Kleingruppe zu besprechen, sodass Sie anschließend in
der Lage sind, die Begriffe dem Rest der Übungsgruppe zu erklären:
(a) Flussnetzwerke und Ford-Fulkerson; (b) Dynamische Programmierung.

P2 (Ford-Fulkerson I)
Führen Sie den Ford-Fulkerson-Algorthmus auf folgendem Flussnetzwerk auf. Geben Sie dabei jeden hinzugefügten Pfad
und Fluss an und zeichnen Sie nach jedem Hinzufügen des Pfads den Restkapazitätengraphen. Verwenden Sie zur Pfadsuche
DFS und wählen Sie immer den kleinsten Knoten zuerst (und den Knoten t vor allen anderen Knoten). Geben Sie
abschließend den maximalen Fluss sowie das finale Flussnetzwerk an.

2
7 8
7
3
3

4 1
6

6 1 9
s 2 3 t

2 5
8

4 5

4
5 6

11 – 1/3
P3 (Ford-Fulkerson II)
Gegeben sei das folgende Flussnetzwerk.

100.000
1 4
0 100
.00 .00
100 0

s 1 t
100 00
.00 0.0
0 10
100.000
2 3

(a) Angenommen, Sie verwenden innerhalb des Ford-Fulkerson-Algorithmus für die Suche nach einem Pfad DFS, bis
Sie einen Pfad zum Ziel gefunden haben. In DFS wählen sie in jeder geraden Iteration (bei 0 beginnend) präferiert
gerade Knoten, bei ungeraden Iterationen ungerade Knoten, und ansonsten immer den kleinsten Knoten. Wie viele
Iterationen benötigt Ford-Fulkerson auf diesem Graphen?
(b) Wie können Sie die Pfadsuche von Ford-Fulkerson verbessern, sodass dieser Fall (im Allgemeinen, nicht nur auf
diesem Graph) nicht mehr vorkommt?

P4 (Dynamische Programmierung – Top-Down Ansatz mit Memoisation)


Betrachten Sie die folgende rekursiv definierte Folge (an )n :
(
an = abn/2c + abn/3c für n ≥ 2
a0 = a1 = 1 sonst.

(a) Berechnen Sie die Werte an für n = 2, . . . , 6.


(b) Verwenden Sie die Methode der dynamischen Programmierung mit Top-Down Ansatz (mit Memoisation) um einen
Algorithmus MemSequence zu entwerfen, der als Eingabe eine ganze Zahl n ≥ 0 bekommt und den n-ten Wert dieser
Folge bestimmt. Beschreiben Sie Ihren Algorithmus und stellen Sie ihn in Pseudocode dar.
(c) Bewerten Sie, ob bei dieser Problemstellung ein Bottom-Up Algorithmus besser geeignet wäre.

P5 (Dynamische Programmierung – Bottom-Up Ansatz)


Zwei Diebe haben n ≥ 1 Juwelen gestohlen und wollen ihre gemeinsame Beute nun fair aufteilen. Der Wert der gestohlenen
Juwelen sei gegeben als w0 , . . . , wn−1 , mit wi ∈ N paarweise verschieden. Dabei könnnen Sie annehmen, dass kein Wert
größer als die Hälfte der Summe aller Werte w0 + . . . + wn−1 ist.
(a) Entwerfen Sie einen rekursiven Algorithmus RecFairPartition, der als Eingabe das Array W = [w0 , . . . , wn−1 ] bekommt
und in Laufzeit O(2n ) entscheidet, ob eine faire Aufteilung möglich ist. Beschreiben Sie Ihren Algorithmus und stellen
Sie ihn in Pseudocode dar.
(b) Argumentieren Sie die Korrektheit und bestätigen Sie die Laufzeit von RecFairPartition.
(c) Angenommen, k ∈ N ist eine obere Schranke der Werte der Juwelen, also wi ≤ k für alle 0 ≤ i ≤ n − 1. Verwenden
Sie die Methode der dynamischen Programmierung mit Bottom-Up Ansatz um  einen Algorithmus DynFairPartition
zu entwerfen, der als Eingabe das Array W bekommt und in Laufzeit O kn2 entscheidet, ob eine faire Aufteilung
der Juwelen möglich ist.
(d) Argumentieren Sie die Korrektheit und bestätigen Sie die Laufzeit von DynFairPartition.

11 – 2/3
Hausübungen
In diesem Bereich finden Sie die theoretischen Hausübungen von Blatt 11. Bitte beachten Sie, dass die Hausübung auf
diesem Blatt nicht abgegeben und bewertet wird, und damit auch nicht Teil der Studienleistung ist.

H1 (Ford-Fulkerson III) (0 Punkte)

Führen Sie den Ford-Fulkerson-Algorthmus auf folgendem Flussnetzwerk auf. Geben Sie dabei jeden hinzugefügten Pfad
und Fluss an und zeichnen Sie nach jedem Hinzufügen des Pfads den Restkapazitätengraphen. Geben Sie abschließend
den maximalen Fluss sowie das finale Flussnetzwerk an.
(a) Verwenden Sie zur Pfadsuche DFS und wählen Sie immer den kleinsten Knoten zuerst (und den Knoten t vor allen
anderen Knoten).
(b) Verwenden Sie nun stattdessen BFS zur Pfadsuche.

4 12
1 4 7

4 15
12 13

21 4 17 14
s 2 5 8 t

7 6 12
3

9 11
3 6 9

H2 (Palindrome) (0 Punkte)

Ein Palindrom ist ein Wort w, welches vorwärts und rückwärts gelesen genau denselben Text ergibt. Beispiele für Palin-
drome sind ,regallager‘, ,reittier‘, ,neben‘ und ,rentner‘.
Offensichtlich kann jedes Wort als Sequenz von Palindromen zerlegt werden, indem man einfach die einzelnen Buchstaben
als Palindrome auffasst. Eine Zerlegung in Palindrome ist jedoch nicht immer eindeutig: Beispielsweise kann der String
,ebebbe‘ als ,e|b|ebbe‘, ,ebe|bb|e‘, ,e|beb|b|e‘, oder ,e|b|e|b|b|e‘ in Palindrome zerlegt werden. Wir bezeichnen die minimale
Anzahl von Palindromen, in die ein Wort w zerlegt werden kann, mit p(w).
(a) Verwenden Sie die Methode der dynamischen Programmierung mit Bottom-Up Ansatz um einen Algorithmus
MinNumberPalindromes zu entwerfen, der als Eingabe einen String w bekommt und die Zahl p(w) in Laufzeit O len 2
berechnet (hier ist len = length(w) die Länge von w). Eine entsprechende Zerlegung in Palindrome muss nicht aus-
gegeben werden. Beschreiben Sie Ihren Algorithmus und stellen Sie ihn in Pseudocode dar.
(b) Beweisen Sie die Korrektheit und bestätigen Sie die Laufzeit Ihres Algorithmus.

11 – 3/3

Das könnte Ihnen auch gefallen