Sie sind auf Seite 1von 26

Matrikelnummer:

Nachname:
Bitte tragen Sie Ihre Matrikelnummer
Vorname: und Ihren Namen in die dafür vorge-
sehenen Felder ein. Bitte in deutlicher
Hörsaal: Handschrift mit einem dokumentech-
Sitzplatz: ten Stift (nicht Bleistift).

1. Klausur Datenstrukturen, Algorithmen und


Programmierung 2 (DAP2), SoSe 2021
5. August 2021

Hinweise

1. Benutzen Sie einen dokumentenechten, nicht roten Stift.


2. Als Hilfsmittel ist ein handbeschriebener DIN-A4-Zettel zugelassen.
Dieser ist im Anschluss an die Bearbeitungszeit in die Klausur einzufügen.
3. Zusätzliches Papier wird bei Bedarf von der Aufsicht bereitgestellt. Die Ver-
wendung eigenen Papiers ist nicht gestattet.
4. Werden zu einer Aufgabe mehrere Lösungen abgegeben, wird nur die erste
gewertet, die anordnungsmäßig nach der Aufgabenstellung kommt. Verdeut-
lichen Sie also Ihre endgültige Lösung.
5. Ergebnisse, Algorithmen und Datenstrukturen aus der Vorlesung dürfen zi-
tiert werden. Ergebnisse aus den Übungen dürfen unter Angabe korrekter
Herleitung verwendet werden.

Wir wünschen Ihnen viel Erfolg!

Bestehensgrenze: 25 Punkte.
Bearbeitungszeit: 180 Minuten.
Aufgabe 1 2 3 4 5 6 7 8
max. Punktzahl 4 4 4 6 8 8 8 8 Punkte
erreichte Pkt. Note
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 1 (4 Punkte): B-Bäume


Gegeben sei folgender B-Baum T mit Parameter t = 2.

10 26

3 7 14 17 22 42 77

Fügen Sie die folgenden Elemente in der angegebenen Reihenfolge in den B-Baum
T ein:

43, 41, 80, 16.

Geben Sie den Baum T nach jeder Operation an. Kennzeichnen Sie zudem für jede
Einfüge-Operationen die ggf. durchgeführten Split-Operationen.
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 2 (4 Punkte): Algorithmus von Prim


Gegeben sei der folgende Graph:

g
10 20
15
6 5
b e f
4 9
11 6
8
a c h i
9 3 8

Führen Sie den Algorithmus von Prim zur Berechnung von minimalen Spannbäu-
men auf dem gegebenen Graphen mit Startknoten h aus. Tragen Sie dazu für jede
Iteration in die Tabelle ein:

• den Knoten, der mit Extract-Min aus der Prioritätswarteschlange entfernt


wird; und

• die Prioritäten der Knoten in der Prioritätswarteschlange nach der Iteration.

Hinweis: Auf der nächsten Seite steht Ihnen bei Bedarf eine Ersatztabelle zur
Verfügung. Bei Gebrauch der Ersatztabelle ist die erste Tabelle kenntlich durch-
zustreichen.

Extract-Min Knoten d[a] d[b] d[c] d[e] d[f ] d[g] d[h] d[i]
– ∞ ∞ ∞ ∞ ∞ ∞ 0 ∞
h X
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Ersatztabelle (bei Benutzung dieser Tabelle muss die obere Tabelle durchgestri-
chen werden!):

Extract-Min Knoten d[a] d[b] d[c] d[e] d[f ] d[g] d[h] d[i]
– ∞ ∞ ∞ ∞ ∞ ∞ 0 ∞
h X
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 3 (4 Punkte): Längste gemeinsame Teilfolge


Bestimmen Sie für die beiden folgenden Sequenzen die Tabelle zur Berechnung des
längsten gemeinsamen Teilfolge (Longest Common Subsequence) mittels dynami-
scher Programmierung.
S1 = AGACTAA
S2 = GTATAAG
Bestimmen Sie anschließend eine der längsten gemeinsamen Teilfolgen.
Hinweis: Auf der nächsten Seite steht Ihnen bei Bedarf eine Ersatztabelle zur
Verfügung. Bei Gebrauch der Ersatztabelle ist die erste Tabelle kenntlich durch-
zustreichen.

LCS(S1 , S2 ) A G A C T A A
G
T
A
T
A
A
G

LCS =
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Ersatztabelle (bei Benutzung dieser Tabelle muss die obere Tabelle durchgestri-
chen werden!):

LCS(S1 , S2 ) A G A C T A A
G
T
A
T
A
A
G

LCS =
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 4 (6 Punkte): Schleifeninvariante


Gegeben sei das folgende Programm, das als Eingabe zwei natürliche Zahlen a und
b erhält.
BerechnePotenz(a, b) :
1 x←b
2 y←1
3 while x > 0 do
4 y ←y·a
5 x←x−1
6 return y
Beweisen Sie, dass das Programm bei Eingabe von zwei natürlichen Zahlen a und
b den Wert ab zurück gibt.
Gehen Sie dazu folgendermaßen vor:

a) Formulieren Sie eine geeignete Schleifeninvariante, die zu Beginn (und Ende)


jeder Iteration der While-Schleife gilt.

b) Beweisen Sie die Schleifeninvariante.

c) Verwenden Sie diese Schleifeninvariante, um zu zeigen, dass das Programm


den Wert ab ausgibt.
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 5 (8 Punkte): Gierige Algorithmen


Ein ungerichteter Graph G = (V, E) heißt d-beschränkt, wenn jeder Knoten
höchstens d Nachbarknoten besitzt, also der Grad jedes Knoten nach oben durch
d beschränkt ist: ∀v ∈ V : dG (v) ≤ d
Für einen Graphen G = (V, E) existiert eine k-Färbung, wenn man es mit einer
Auswahl von k Farben schafft, jedem Knoten eine Farbe zuzuordnen und dabei
Nachbarknoten nicht dieselbe Farbe haben dürfen.
Die Färbung kann auch als Abbildung c : V → {1, 2, ..., k} verstanden werden,
wobei für alle Kanten (u, v) ∈ E gelten muss: c(u) 6= c(v)
Ein Beispiel einer 4-Färbung eines 3-beschränkten ungerichteten Graphen ist in
der folgenden Abbildung gegeben.

3 1 2 4

1 4 3 2

a) Beschreiben Sie kurz die Funktionsweise eines gierigen Algorithmus, welcher


bei Eingabe eines d-beschränkten ungerichteten Graphen G = (V, E) in Zeit
O(|V | · d) eine (d + 1)-Färbung von G bestimmt. Die Eingabe besteht aus der
Adjazenzlistendarstellung adjG und der Konstanten d. Geben Sie zusätzlich
den Algorithmus in Pseudocode an.

b) Begründen Sie, warum Ihr Algorithmus die vorgegebene Laufzeitschranke


einhält oder geben Sie, falls ihr Algorithmus diese Schranke nicht einhält,
eine möglichst gute Schranke für die Worst-Case-Laufzeit Ihres Algorithmus
an und begründen Sie diese.

c) Beweisen Sie die Korrektheit Ihres Algorithmus, d.h. dass ihr Algorithmus für
jeden ungerichteten Graphen G mit maximalem Knotengrad d eine (d + 1)-
Färbung bestimmt.
Hinweis: Hier soll nur die Korrektheit und nicht die Optimalität bewiesen
werden, d.h. das „Der Gierige liegt vorn“-Verfahren ist unangebracht.
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 6 (8 Punkte): Teile und Herrsche


Gegeben sei ein aufsteigend sortiertes Array A von natürlichen Zahlen. Es gibt
keine Zahl, die mehrfach vorkommt.
Die Funktion numGreater(A, x) soll die Anzahl an Zahlen zurückgeben, die größer
als x sind.

a) Entwickeln Sie einen Teile-und-Herrsche-Algorithmus, der die Funkti-


on numGreater(A, x) implementiert. Für die volle Punktzahl wird ein Al-
gorithmus erwartet, dessen Worst-Case-Laufzeit durch O(log n) beschränkt
ist. Beschreiben Sie kurz die Funktionsweise Ihres Algorithmus. Geben Sie
den Algorithmus dann in Pseudocode an.

b) Analysieren Sie die Laufzeit Ihres Algorithmus. Sie dürfen das Mastertheo-
rem verwenden.

c) Beweisen Sie, dass Ihr Algorithmus die Funktion numGreater(A,x) korrekt


implementiert.
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 7 (8 Punkte): Dynamische Programmierung


Das Superheldenteam der Rächer muss sich in seinem großen Kampf gegen ih-
ren Widersacher Thanatos behaupten. Um zu der Schlacht zu gelangen, sind die
Helden, die nicht selbst fliegen können, auf den Jet ihres Mitstreiters Anton Kräf-
tig angewiesen. Kräftig hat sich in seinen Berechnungen leider etwas vertan und
der Jet kann gar nicht alle Rächer mitnehmen, da er nur maximal M Kilogramm
tragen kann und nur über A Quadratmeter Transportfläche verfügt. Die Rächer
müssen nun überlegen, wer mitkommen darf. Dafür haben sie für jeden Rächer
zusammengetragen
• welches Gewicht wi ∈ N er oder sie mit Ausrüstung hat,
• wie viel Transportfläche ai ∈ N er oder sie mit Ausrüstung benötigt und
• über welche Kampfkraft ki ∈ N er oder sie verfügt.
Selbstverständlich soll das Team der Rächer, die zum Kampf aufbrechen, in Summe
über eine möglichst große Kampfkraft verfügen. Sie wurden nun damit beauftragt,
das Team auszuwählen, dass zum Kampf fliegen darf.
Im Beispiel (rechts) gibt es 4 Rächer. Wenn Rächer 1 2 3 4
Kräftig 10 m2 Transportfläche zur Vefügung w[i] 80 90 70 120
hat und 200 kg transportieren kann, dann wä- a[i] 6 1 7 8
ren folgende Teamzusammenstellungen möglich: k[i] 15 25 17 38
{1, 2}, {2, 3}, {4} Die optimale Kampfkraft 42 er-
gibt sich in dem Team aus Rächer 2 und Rächer 3. Es ist z.B. nicht möglich neben
Rächer 4 einen anderen Rächer mitzunehmen, da entweder zu wenig Transportflä-
che zur Verfügung steht oder das Gesamtgewicht zu groß ist.

a) Geben Sie eine rekursive Formulierung für K(i, w, a) an, wobei K(i, w, a) die
maximale aufsummierte Kampfkraft eines Teams ist, das maximal w Kilo-
gramm wiegt, maximal a Quadratmeter Platz benötigt und nur die ersten i
Rächer verwendet.

b) Beweisen Sie die Korrektheit Ihrer rekursiven Formulierung aus Aufgaben-


teil a) mittels Induktion.

c) Geben Sie einen Algorithmus in Pseudocode an, der auf dem Prinzip der
dynamischen Programmierung beruht und die maximale Kampfkraft einer
Teamzusammenstellung zurück gibt. Der Algorithmus erhält als Eingabe die
Zahl n der Rächer und die Arrays w, a und k, die das Gewicht, die Transport-
fläche und die Kampfkraft der n zur Verfügung stehender Rächer enthalten.

d) Analysieren Sie die Laufzeit Ihres Algorithmus aus Teilaufgabe c).


Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Aufgabe 8 (8 Punkte): Datenstrukturen


Gegeben sei ein fester Wert k ∈ N+ . Wir wollen eine Menge S ⊆ {1, . . . , k} von na-
türlichen Zahlen in einer dynamischen Datenstruktur verwalten. Die Datenstruktur
sollte folgende Operationen in jeweils O(log k) Zeit unterstützen:

• Insert(i): Fügt den Wert i ∈ {1, . . . , k} in die Datenstruktur ein (wenn der
Wert bereits existiert, soll nichts geschehen).

• ExtractMax(): Gibt den größten in der Datenstruktur gespeicherten Wert i


zurück, und entfernt i anschließend aus der Datenstruktur.

• ExtractReverseMax(): Gibt den Wert i zurück, der (unter allen in der Daten-
struktur gespeicherten Werten) den größten Rückwärtswert hat, und entfernt
i anschließend aus der Datenstruktur.
Der Rückwärtswert rev(i) eines Wertes i ∈ {1, . . . , k} kann berechnet wer-
den, indem die Reihenfolge der Dezimalstellen von i umgedreht wird.
Beispiele: rev(1337) = 7331, rev(82956) = 65928, rev(1) = 1

Die Datenstruktur sollte zu jedem Zeitpunkt nur O(n) Speicherzellen benötigen,


wobei n = |S| die Anzahl der aktuell gespeicherten Elemente ist.

a) Geben Sie in Pseudocode einen Algorithmus an, der mithilfe arithmetischer


Operationen für einen gegebenen Wert i ⊆ {1, . . . , k} im Dezimalsystem den
Rückwärtswert rev(i) berechnet. Bestimmen Sie die asymptotische Worstcase-
Laufzeit des Algorithmus so genau wie möglich.
Tipp: Wie viele Dezimalstellen hat i?

b) Beschreiben Sie in wenigen kurzen Sätzen, wie Ihre Datenstruktur aufgebaut


ist und wie die angegeben Operationen realisiert werden. Begründen Sie kurz,
dass die Datenstruktur korrekt arbeitet und die geforderte Laufzeit erreicht
wird. Sie dürfen aus der Vorlesung bekannte Datenstrukturen und
Zeitschranken ohne erneuten Beweis benutzen!
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Zusatzblatt zu Aufgabe:
Klausur „DAP 2“ vom 05.08.2021, TU Dortmund, M. Niewerth

Zusatzblatt zu Aufgabe:

Das könnte Ihnen auch gefallen