Sie sind auf Seite 1von 4

MUNCHEN

TECHNISCHE UNIVERSITAT

T FU
R INFORMATIK
FAKULTA
Lehrstuhl fu
r Sprachen und Beschreibungsstrukturen
Grundlagen: Algorithmen und Datenstrukturen
Prof. Dr. Helmut Seidl, J. Kranz, A. Reuss, R. Vogler

SS 2015

Ubungsblatt 5
08.05.15

Abgabe: 18.05.15 (vor 10 Uhr)


Aufgabe 5.1 (P) Bankkonto-Methode
Diese Tutoraufgabe ist ein Kurztutorial f
ur die Bankkonto-Methode, die in der Vorlesung f
ur
dynamische Arrays verwendet wurde. Die zweite Tutoraufgabe veranschaulicht die Theorie
an verallgemeinerten dynamischen Arrays.
Sei S eine Menge von Operationen, und bezeichne T () (eine obere Schranke f
ur) die
Laufzeit einer Operation S (diese Laufzeit kann vom aktuellen Zustand des Objekts,
auf dem die Operation
Pmwirkt, sowie von Argumenten abhangen). Analog dazu bezeichne
T (1 , 2 , . . . , m ) :=
ur) die Laufzeit
i=1 T (i ) (die korrespondierende obere Schranke f
der Operationsfolge (1 , 2 , . . . , m ).
Ziel einer amortisierten Analyse ist, eine moglichst gute obere Schranke f
ur T (1 , 2 , . . . , m )
zu finden. Bei der Konto-Methode bestimmen wir dazu eine Funktion : S R, die
folgende Eigenschaften besitzt:
(i) F
ur alle legalen (d.h. ausf
uhrbaren) Operationsfolgen (1 , . . . , m ) gilt

Pm

i=1

(i ) 0.

(ii) ist moglichst gut gewahlt.


Was Eigenschaft (ii) bedeutet, wird spater noch spezifiziert. F
ur S ist () die Ver
anderung des Tokenkontos durch die Operation . Wenn () > 0, dann zahlt die Operation
auf das Konto ein, falls () < 0, dann hebt sie vom Konto ab. A() := T () + ()
nennen wir dann die amortisierte Laufzeit von . (In der
P Vorlesung wird A() auch Tokenlaufzeit genannt.) Entsprechend ist A(1 , . . . , m ) := m
i=1 A(i ) die amortisierte Laufzeit
der Operationsfolge (1 , . . . , m ).
Eigenschaft (i) sagt aus, dass das Tokenkonto nie negativ ist. Die Sinnhaftigkeit eines stets
nichtnegativen Kontos ergibt sich aus folgender Beobachtung:
A(1 , . . . , m ) =

m
X

m
X
A(i ) =
(T (i ) + (i ))

i=1

= T (1 , . . . , m ) +

m
X

i=1

(i ) T (1 , . . . , m )

|i=1 {z

Die amortisierte Laufzeit der Operationsfolge ist also eine obere Schranke f
ur ihre tatsachliche Laufzeit. Jede Tokeneinheit steht f
ur eine gewisse konstante Menge an Laufzeit. Damit
wird auch klar, was die (moglicherweise nicht ganzzahlige) Tokenzahl auf dem Konto aussagt: Es ist genau der Wert, um den die amortisierte Laufzeit die durch T gegebene (obere
Schranke f
ur die) tatsachliche Laufzeit u
bersteigt.
Nun zu Eigenschaft (ii). Das wichtigste Ziel ist, dass die amortisierten Laufzeiten A(1 , . . . , m )
von Operationsfolgen asymptotisch moglichst klein sind, damit man gute obere Schranken
f
ur die tatsachliche Laufzeit von Operationsfolgen erhalt.

2
Zu diesem Zwecke ist es oft zielf
uhrend, so zu wahlen, dass maxS (A()) moglichst klein
ist, d.h. die Operation mit der schlechtesten amortisierte Laufzeit soll moglichst geringe
amortisierte Laufzeit besitzen. Wenn dieses Ziel erreicht ist, ist O(m maxS (A())) eine
obere Schranke f
ur die asymptotische Laufzeit von Worst-Case-Operationsfolgen (wobei die
Lange m der Operationsfolgen die asymptotische Variable ist). Bei einer hinreichend guten
Wahl von und Analyse ist diese obere Schranke oft nicht schlecht.
Aufgabe 5.2 (P) Dynamische Arrays
Wir betrachten die Konto-Methode angewandt auf dynamische Arrays f
ur beliebige Werte
und mit > > 1. Hierbei beschranken wir uns auf den analytisch etwas einfacheren
Fall, dass , N. Die Analyse f
ur nicht ganzzahlige und ist ahnlich. 1
Man erinnere sich, dass dynamische Arrays u
ugen eines
ber die Methoden pushBack (= Einf
Elements am Ende der Liste) und popBack (Loschen des letzten Elements der Liste)

verwaltet werden. Im Folgenden bezeichne n stets die aktuelle Anzahl der Elemente im
Array, und w die Groe des Arrays. Unter bestimmten Voraussetzungen rufen pushBack
und popBack die Methode reallocate als Untermethode auf:
Wenn bei pushBack vor der Einf
ugung des Elements das Array voll ist (d.h. n = w), dann
wird die Methode reallocate aufgerufen, die ein neues Array der Groe n anlegt und alle
alten Elemente in das neue Array kopiert. Anschlieend wird das neue Element eingef
ugt.
Wenn bei popBack nach der Loschung des letzten Elements der F
ullstand des Arrays nur
noch maximal 1/ betragt (d.h. n w), dann wird die Funktion reallocate aufgerufen,
die ein neues Array der Groe n anlegt und alle Elemente in das neue Array kopiert. Wir
fassen reallocate als eigenstandige Methode auf.
Es ist nicht schwierig zu sehen, dass die tatsachliche Laufzeit von pushBack und popBack
konstant ist (d.h. durch eine Konstante nach oben beschrankt), und die Laufzeit von reallocate durch O(1) + c n beschrankt ist, wobei c eine Konstante ist und n die Zahl der
kopierten Elemente. Wie in der Vorlesung ist es legitim, c = 1 zu setzen, indem wir annehmen, dass wir die Laufzeit in einer Einheit messen, die gerade der Laufzeit einer einzelnen
Kopieroperation entspricht. Wir erhalten damit:
T (pushBack)
T (popBack)
T (reallocate)

O(1)
O(1)
= O(1) + n, wobei n = Anzahl der kopierten Elemente

Ziel dieser Aufgabe ist der Nachweis mit einer amortisierten Analyse, dass die Laufzeit von
Operationen der Lange m auf einem zu Beginn leeren dynamischen Array in O(m) liegt (zu
Beginn hat das Array Groe 1).
Daf
ur legen wir fest, dass pushBack /( 1) Token auf das Konto einzahlt, popBack
/( ) Token einzahlt, und reallocate n Token vom Konto abhebt, wenn n Elemente
1

In einem solchen Fall muss die Gr


oe des neuen Arrays mithilfe der Aufrundungsfunktion als d
ne definiert werden, was eine entsprechende Anpassung der Funktion erfordert und die Analyse etwas
komplizierter macht. In der Literatur werden in solchen Fallen eigentlich notwendige Auf- oder Abrundungen
nicht selten einfach weggelassen, um die Analyse zu vereinfachen. Die Analyse ist dann zwar nicht mehr
absolut pr
azise, aber zumindest gr
oenordnungsmaig gut genug und man erkennt die dahinterstehende

Idee. Der Leser ist dann gefordert, die Details selber zu erganzen. Auf einen Blick zu erkennen, wann solche
Vereinfachungen m
oglich sind, erfordert etwas Erfahrung.

3
kopiert werden, also:
(pushBack)
(popBack)
(reallocate)

= /( 1)
= /( )
= n, wobei n = Anzahl der kopierten Elemente

(a) Zeigen Sie, dass dieses Amortisationsschema zulassig ist, indem Sie zeigen, dass das
Tokenkonto zu jedem Zeitpunkt nichtnegativ ist.
Hinweis: Bezeichne n1 die Zahl der Elemente unmittelbar nach einem reallocate (im
Falle von pushBack also noch vor der Einf
ugung des neuen Elements). Machen Sie sich
klar, dass das Array zu diesem Zeitpunkt Groe w1 := n1 hat, und w1 n1 Positionen
frei sind. Das nachste reallocate wird erst dann aufgerufen, wenn f
ur die Zahl n der
Elemente entweder n = w1 oder n w1 gilt.
(b) Zeigen Sie, dass unter diesem Amortisationsschema die amortisierte Laufzeit jeder Operation in O(1) liegt, und folgern Sie, dass die Worst-Case-Laufzeit f
ur Operationsfolgen
der Lange m in O(m) liegt.

Aufgabe 5.3 [5 Punkte] (H) O-Notation


Seien f, g, h : N0 R Funktionen mit n0 N : n > n0 : f (n), g(n), h(n) > 0. Zeigen Sie
die folgenden Aussagen:
(a) f (n) (g(n)) f (n)
/ O(g(n)).
(b) f (n) o(g(n)) f (n)
/ (g(n)).
(c) f (n) (g(n)) und h(n) o(g(n)) f (n) (h(n)).
(d) f (n) O(g(n)) und h(n) (g(n)) f (n) o(h(n)).
Anmerkung: Die R
uckrichtungen dieser Gesetze gelten im Allgemeinen nicht!
Aufgabe 5.4 [5 Punkte] (H) Zufallsvariablen
Betrachten Sie das folgende Problem: Gegeben ist eine Zahl a {0, 1} und eine Zahlenfolge
(x1 , x2 , . . . , xk ), wobei xi {0, 1} f
ur alle i {1, . . . , k} gilt. Gefragt ist, ob a in der
Zahlenfolge vorkommt.
Algorithmus 1 lost offensichtlich dieses Problem. Berechnen Sie die erwartete Anzahl der
Vergleiche xi = a, die dieser Algorithmus durchf
uhrt, wenn jede Eingabe mit den oben beschriebenen Eigenschaften mit derselben Wahrscheinlichkeit auftritt. Bestimmen Sie zudem
die asymptotisch erwartete Laufzeit.
Hinweis: Verwenden Sie, wie in der Vorlesung demonstriert binare Zufallsvariablen (sogenannte Indikatorvariablen). Verwenden Sie zudem, dass f
ur eine binare Zufallsvariable Y mit
P[Y = 1] = c und P[Y = 0] = 1 c f
ur ein c [0, 1], der Erwartungswert von Y genau c ist,
P
n+1
d.h. E[Y ] = P[Y = 1] = c. Sie konnen zudem f
ur c 6= 1 von der Gleichung ni=0 ci = c c11
Gebrauch machen.

1
2
3
4
5
6
7
8

Input: int a, int[] (x1 , x2 , . . . , xk )


int i = 1
while i k do
if xi = a then
return Ja
end
i=i+1
end
return Nein
Algorithm 1: IsElementOf

Aufgabe 5.5 [10 Punkte] (H) Dynamische Felder


In dieser Aufgabe geht es darum, ein dynamische Feld zu implementieren. Ein Progammger
ust des in Java zu implementierenden Programms wird als separates Archiv mit diesem

Ubungsblatt
verteilt; die Abgabe erfolgt wie u
blich u
ber TUMjudge. Kommentare im gegebenen Quelltext enthalten wichtige Hinweise und Beispiele.
Implementieren Sie die angegebenen Methoden der Klasse DynamicArray. Sie konnen beliebige Objektvariablen hinzuf
ugen. Um die Testfalle erfolgreich zu meistern, ist es wichtig,
folgende Invarianten genau zu beachten:
a) Durch das Einf
ugen andert sich die Groe des internen Feldes dann und nur dann,
wenn das interne Feld das neue Element nicht mehr aufnehmen kann. In diesem Fall
gilt f
ur die Lange (length) des internen Feldes nach dem Einf
ugen:
length = elemente growthF actor

(1)

Wobei elemente die Anzahl an Elemente im dynamischen Feld und growthF actor den
Wachstumsfaktor bezeichnet.
b) Durch das Loschen von Elementen andert sich die Groe des internen Feldes dann und
nur dann, wenn der bereitgestellte Speicher nach dem Loschvorgang mehr als um das
[maximaler Overhead]-fache groer ware als die Speicheranforderung. In diesem Fall
f
ur die Lange (length) des internen Feldes ebenfalls nach dem Einf
ugen:
length = elemente growthF actor

(2)

Wobei wieder elemente die Anzahl an Elemente im dynamischen Feld und growthF actor
den Wachstumsfaktor bezeichnet.
Bitte beachten Sie, dass eine Fehlerbehandlung nicht verlangt wird; es ist allerdings oft hilfreich, auf Fehlersituationen sinnvoll zu reagieren, da man auf diese Weise Programmierfehler
leichter finden kann.
Desweiteren sei nochmals auf unsere Kommunikationsplattform bei Piazza hingewiesen. Dort
konnen Fragen zur Hausaufgabe gestellt und die Fragen anderer Studenten betrachtet und
diskutiert werden. In der Vorlesungen konnen Detailfragen zu Hausaufgaben dagegen nur be
antwortet werden, wenn Sie uns vor der Vorlesung darauf hinweisen, sodass ein Ubungsleiter
z.B. zur Pause der Pause der Vorlesung kommen kann.