7.3 Fallbeispiel III: Das Listen-Zugriffsproblem 75
7.3.2 Kompetitive Rate
7-23 Amortisierte Analyse der kompetitiven Rate 7-23
I
SatzDie kompetitive Rate der Move-to-Front-Strategie ist höchstens 2.
Beweis. Wir zeigen, dass die amortisierten Kosten der Move-to-Front-Strategie höchstens doppelt so groß sind wie die der optimalen Strategie. Hieraus folgt nach dem Hauptsatz, dass dies auch für die realen Kosten der Move-to-Front-Strategie gilt.
– Seix1, . . . ,xneine feste Folge angefragter Elemente.
– SeiLijeweils die Liste nach demi-ten Schritt gemäß den Entscheidungen eines opti- malen Offline-Algorithmus.
– SeiL0ijeweils die Liste nach demi-ten Schritt gemäß den Entscheidungen der Move-to- Front-Strategie.
– Seididie Tiefe vonxiinLiunddi0entsprechend fürL0i.
– Zwei Elemente der Liste bilden eine Inversion, wenn ihre Reihenfolge inLi und L0i unterschiedlich ist.
i 1 2 3 4 5 6 7 Gesamtkosten
xi c b a c b a c
Li a bc
a bc
a bc
a bc
a bc
a bc
a bc
di 2 1 0 2 1 0 2 8
L0i ab c
ac b
bc a
a bc
ca b
bc a
a bc
di0 2 2 2 2 2 2 2 14
Inversionen 0 2 2 0 2 2 0
Definiere eine Potentialfunktion wie folgt:
Φ(L0i) =Anzahl Inversionen zuLi. Offenbar istΦinitial Null und nie negativ.
Die amortisierten Kosten jeder Entscheidung sind per Definitionai=di0+Φ(L0i)−Φ(L0i−1). Wir behaupten, dass gilt:
ai≤2di.
Haben wir dies gezeigt, so sind wir fertig: Dann sind die amortisierten Gesamtkosten (und damit auch die realen Gesamtkosten) nämlich höchstens doppelt so wie die optimalen Ko- sten.
Zum Beweis vonai≤2diargumentieren wir so: Man stelle sich vor,xiwird »langsam inL0i nach oben geschoben«, wohingegen es »inLierstmal bleibt, wo es ist«. Dann wird, solangexi unterhalb der Tiefediist, in jedem Schritt genau eine Inversion zuLiaufgelöst, ab der Tiefe dihingegen wieder je eine neue Inversion geschaffen. Insgesamt verringert sich das Potential erst umdi0−di, um sich dann umdizu erhöhen. Wird nunxiauch inLilangsam angehoben, so werden weitere Inversionen aufgelöst, das Potential verringert sich also weiter. Insgesamt ergibt sich eine maximale Potentialsteigerung vondi−(di0−di) =2di−di0. Also giltai≤ di0+2di−d0i=2di.
7 Analysemethode: Amortisierung
Zusammenfassung dieses Kapitels 77
Zusammenfassung dieses Kapitels
7-24 Problemstellung 7-24
Entwurfsmethode
A & D
Analysemethode
Klassifikation
Stack-Verwaltung Zähler-Verwaltung adhoc
Stack Zähler
Amortisierte Analyse
lineare Kosten
Listen-Zugriffs-Problem
adhoc
Move-To-Front
Amortisierte Analyse / Potential-Methode 2-kompetitiv
I
Amortisierte KostenEine Zuordnung von Kosten zu Operationen nennt manamortisierte Kosten, wenn für jede Folge von Operationen gilt:
reale Kosten≤Summe der amortisierten Kosten.
I
Potentialmethode– DiePotentialmethodedefiniert amortisierte Kostenimplizitdurch einePotentialfunkti- onΦ.
– Diese ordnet Datenstrukturendinichtnegative reelle Zahlen zu.
– Die amortisierten Kosten einer Operation sind dann ai= ci
|{z}
reale Kosten
+Φ(di+1)−Φ(di)
| {z }
Potentialänderung
.
I
Hauptsatz über amortisierte Kosten Es giltn
X
i=1
ci
| {z }
reale Gesamtkosten
= Φ(d0)−Φ(dn)
| {z }
Gesamtpotentialdifferenz
+
n
X
i=1
ai
| {z }
amortisierte Gesamtkosten
.
Falls das Potential anfangs Null war und nie negativ, so gilt
reale Gesamtkosten≤amortisierte Gesamtkosten. (Für einzelne Operationen gilt dies hingegen gerade oft nicht.)
Zum Weiterlesen
[1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein,Introduc- tion to Algorithms,zweite Auflage, MIT Press, 2001, Kapitel »Amortized Analysis«.
78 7 Analysemethode: Amortisierung Übungen zu diesem Kapitel
Übungen zu diesem Kapitel
Übung 7.1 Kompetitive Rate des DOUBLE COVER Algorithmus für dask-Server-Problem analysieren, schwer
In Übung 6.2 haben Sie dask-Server-Problem auf den natürlichen Zahlen und den double-cover-Al- gorithmus zu dessen Lösung kennengelernt. Im Folgenden soll mithilfe der Potential-Methode ge- zeigt werden, dass der double cover-Algorithmus für dask-Server-Problemk-kompetitiv ist. Hierzu verwenden wir folgende Potentialfunktion: Sei optimal ein optimaler offline Algorithmus für dask- Server-Problem undq0,q1, . . . ,qneine Folge von Anfragen. Seici= (ci1, . . . ,cik)die Konfiguration von optimal unddi= (di1, . . . ,dik)die Konfiguration von double cover in Rundei. Seimider mi- nimale Wert vonPk
j=1|cij−dif(j)|über alle bijektiven Zuordnungen f:{1, . . . ,k} → {1, . . . ,k}. Sei weiterhingi=P
(j,`)∈{1,...,k}2|dij−di`|. Wir betrachten die PotentialfunktionΦ(di) =k·mi+gi, 1. Geben Sie eine kurze Beispielsequenz von Anfragen an und berechnen Sie dazu eine optimale
Lösung, die Lösung von double cover und die Werte fürmi,gi, undΦ(di)in jeder Rundei. 2. SeiAein beliebiger Offline-Algorithmus für dask-Server Problem. Wandeln SieAin einen Al-
gorithmusA0um, bei dem (1) Server nur auf Anfragen stehen bleibt und (2) der maximal einen Server zur gleichen Zeit bewegt. Folgern Sie hieraus, dass man sich bei der Betrachtung von op- timalen Algorithmen auf Solche beschränken kann, die dieses Verhalten haben. Passen Sie Ihre optimale Berechnung aus 1. entsprechend an.
3. Zeigen Sie, dass die amortisierten Kostenaiim Schrittibezüglich der PotentialfunktionΦma- ximalk·ΓimitΓi=Pk
j=1|ci−1j −cij|beträgt. Definieren Sie hierzu∆i=Pk
j=1|di−1j −dij|und stellen Sie die Gleichung für die amortisierten KostenaibezüglichΦauf. Betrachten Sie nun die Bewegungen von optimal und double cover in Rundeigetrennt:
3.1 Beweisen Sie, dass sich durch die Bewegung von optimal die Differenzmi−mi−1um maximalΓierhöht.
3.2 Behandeln Sie die Fälleqi∈/Iiundqi∈Iieinzeln und zeigen Sie jeweils, dass sich durch die Bewegung von double cover die Differenzmi−mi−1um mindestens∆ireduziert und die Differenzgi−gi−1um maximal(k−1)·∆ierhöht.
Folgern Sieai≤k·Γiund wenden Sie den Hauptsatz der amortisierten Analyse an, um hiermit zu zeigen, dass double coverk-kompetitiv.
Übung 7.2 Warteschlangen mit Kellern implementieren, mittel
Warteschlangen sind Datenstrukturen mit den Methodenenqueue(e)unddequeue(). Durchenqueue(e) reiht man ein Element am Ende der Warteschlange ein, mitdequeue()entnimmt man das erste Element der Warteschlange.
Beschreiben Sie die Implementierung einer Warteschlange mithilfe von zwei Kellern und zeigen Sie mit der Potentialmethode, dass die amortisierten Kosten eines MethodenaufrufsO(1)betragen.
Zur Erinnerung:Ein Keller ist eine Datenstruktur mit den Operationenpush(e)undpop(), mit denen man ein Element in den Keller legen beziehungsweise das oberste Element aus dem Keller entnehmen kann. Wir betrachten Keller, bei denen die Laufzeit der Operationen inO(1)liegt.
Übung 7.3 Binärer Zähler mit Rücksetzbefehl, mittel Auf Seite 7-6 habe Sie die Methode
void increment (int[] A) {
int i = 0;
while (A[i] == 1) { A[i] = 0;
i++;
}
A[i] = 1;
}
zur Inkrementierung eines binären Zählers kennengelernt. Es wurde bereits mittels einer amortisierten Analyse gezeigt, dass sich die Laufzeit vonnAufrufen durch eine Funktion inO(n)abschätzen lässt.
Neben der Inkrementierung betrachten wir nun als zusätzliche Operation die Zurücksetzung, bei der alle Bits der Zahl auf 0 gesetzt werden. Wir nehmen an, dass man eine Zeiteinheit zum Zurücksetzen eines Bits investieren muss.
1. Passen Sie den Pseudocode der Inkrementiermethode so an, dass sich der Algorithmus immer die Position des höchstwertigen 1-Bits merkt.
2. Geben Sie den Pseudocode einer Rücksetzmethode an, die ausgehend vom höchstwertigen 1-Bit alle Positionen bis zur Position 0 abläuft und 1-Bits auf 0 setzt.
3. Verwenden Sie die Potentialmethode, um zu zeigen, dass die Laufzeit fürnInkrementier- und RücksetzoperationenO(n)beträgt.
7 Analysemethode: Amortisierung
Übungen zu diesem Kapitel 79
Übung 7.4 Warteschlangen mit Mehrfachentnahme, mittel
Erweitern Sie die Implementierung der Warteschlange aus Übung 7.2 ummulti-dequeue(k), eine Ope- ration, welche die erstenkElemente aus der Warteschlange entnimmt. Wenden Sie die folgende Po- tentialmethode an, um zu zeigen, dass die amortisierten Kosten für jeden Aufruf von enqueue(e), dequeue()undmulti-dequeue(k)konstant sind:
Φ=2·Anzahl der Element auf dem Enqueue-Stack+ Anzahl der Elemente auf dem Dequeue-Stack.
Übung 7.5 Binärer Zähler mit Division, mittel
Der binäre Zähler aus der Vorlesung soll nun um eine Methodedivision-by-two()erweitert werden, welche die im Array gespeicherte natürliche Zahl durch 2 dividiert. Für den Zähler bedeutet dies, dass das lsb gelöscht und alle anderen Einträge um eine Position in dessen Richtung verschoben werden.
Geben Sie wie in Übung 7.3 eine Methode für die neue Operation an und zeigen Sie mithilfe der folgenden Potentialfunktion, dass die Laufzeit fürnInkrementier- und DivisionsoperationenO(n)be- trägt:
Φ=Anzahl der 1-Bits+Wert der Zahl.
80 8 A&D: Union-Find
8-1 8-1
Kapitel 8
A&D: Union-Find
Vereinigt Euch!
8-2 8-2
Lernziele dieses Kapitels
1. Den optimalen Algorithmus zur Verwaltung disjunkter Mengen erklären können.
2. Die amortisierte Analyse des Algorithmus verstehen.
Inhalte dieses Kapitels
8.1 Die Verwaltung disjunkter Menge 81 8.1.1 Die Problemstellung . . . 81 8.1.2 Die Datenstruktur . . . 82
8.2 Analyse 85
8.2.1 Begriffe: Eimer und Münzen . . . 85 8.2.2 Regeln: Ein- und Auszahlung . . . 85 8.2.3 Abschätzung der amortisierten Kosten . 87 8.2.4 Abschätzung des maximalen Levels . . . 88
Worum es heute geht
Worum es heute geht
In der etwas fortgeschrittenen Algorithmik stößt man oft auf Algorithmen und Datenstruk- turen, deren Konstruktion kompliziert ist und die aufwändig zu verwalten sind – wer schon einmal einen AVL-Baum oder einen Fibbonacci-Heap implementieren durfte (höchstwahr- scheinlich wohl aber eher »musste«), weiß, wovon ich spreche. Die Analyse solcher Struk- turen ist dann in der Regel auch kein Zuckerschlecken, schließlich wollen viele Fälle und Probleme bedacht werden.
In seltenen Fällen liefert die Algorithmik uns aber Datenstrukturen oder Algorithmen, die zwar ganz einfach zu erklären sind, aber ziemlich schwierig zu analysieren sind. Ein Bei- spiel solch einer Datenstruktur sind die Union-Wälder, um die es in diesem Kapitel geht.
Sie zu erklären ist wirklich einfach: Es handelt es sich um wurzelgerichtete Wälder, die drei Operationen unterstützen: (1) Einen neuen einzelnen Knoten zum Wald als eigenen Baum hinzufügen, (2) zwei Bäume vereinigen, indem die Wurzel des kleineren Baumes ein wei- teres Kind der Wurzel des anderen wird und (3) von einem Knoten aus die Wurzel eines Baumes suchen und dabei alle Knoten auf dem Pfad zur Wurzel zu direkten Kindern der Wurzel zu machen. Ok, vielleicht doch keine »ganz« einfache Datenstruktur, aber kompli- ziert ist sie nun wirklich nicht.
Ganz anders stehen die Dinge bei der Analyse dieser Datenstruktur. Ältere Lehrbücher trau- en sich den einfachen (!) Teil der Analyse nur in Abschnitten mit einem dicken Sternchen zu präsentieren, der wohl andeuten soll, dass die Formel-Orgien in den Analysen definitiv nicht jugendfrei sind. In den letzten Jahren wurden die Argumente in verschiedenen Veröffentli- chungen zwar deutlich vereinfacht, wirklich einfach sind sie trotzdem noch nicht geworden.
Insofern möchte ich auch für die in diesem Kapitel vorgestellte Analyse, die verschiedene Ideen aus der Literatur kombiniert, gerne eine FSK 16 Einstufung aussprechen – um einen mathematischen Hardcore-Porno, vor dem man empfindliche Studierendenseelen schützen müsste, handelt es sich aber nicht (wenn Sie an so etwas interessiert sind, schauen Sie doch mal in die Orginalliteratur).
8 A&D: Union-Find
8.1 Die Verwaltung disjunkter Menge 81
8.1 Die Verwaltung disjunkter Menge
8.1.1 Die Problemstellung
8-4 Motivation: Der Algorithmus von Kruskal 8-4
1 procedureminimum-spanning-tree(vertices V,edges E,edge weights w)
2 sort the edges by w(ifnecessary)
3 S← ∅
4 foreach edgee={u,v}inorder of increasing weightdo
5 ifuandvareindifferent components of the graph(V,S)then
6 S←S∪
{u,v}
7 returnminimum spanning tree(V,S)
Die Geschwindigkeit dieses Algorithmus hängt an zwei Fragen:
1. Wie schnell lassen sich die Kanten sortieren?
2. Wie schnell lässt sich die Frage beantworten, obuundvin der gleichen Zusammen- hangskomponente liegen?
Wir suchen eine Datenstruktur, um diezweiteFrage schnell zu beantworten.
8-5 Gesucht: Eine Datenstruktur zur Verwaltung disjunkter Mengen. 8-5
Ziele
Wir suchen ein Datenstruktur zurVerwaltung von Familien disjunkter Mengen– in unserem Fall bilden jeweils die Knoten einer Zusammenhangskomponente eine Menge. Wir müssen Mengenvereinigen könnenundtesten können, ob Element in derselben Menge liegen.
Ideen
– Jede Menge wird durch eines seiner Elementrepräsentiert, es heißt derRepräsentant.
– Es gibt eine Methodefind(x), die den Repräsentanten der Mengefindet,diexenthält.
– Zwei Elementexundysind genau dann in derselben Menge, wennfind(x) =find(y). Wir suchen also eine Datenstruktur, die folgende Operationen unterstützt:
init(x) Erzeugt eine einelementige Menge mit dem Elementx. rep(x) Gibt den Repräsentanten der Menge zurück, diexenthält.
unite(x,y) Vereinigt die Mengen, diexundyenthalten.
8-6 Der Algorithmus von Kruskal mit unserer Datenstruktur 8-6
1 procedureminimum-spanning-tree(vertices V,edges E,edge weights w)
2 sort the edges by w(ifnecessary)
3 foreachv∈V do
4 init(v)
5 S← ∅
6 foreach edgee={u,v}inorder of increasing weightdo
7 fu←rep(u)
8 fv←rep(v)
9 if fu6=fvthen
10 unite(fu,fv)
11 S←S∪
{u,v}
12 returnminimum spanning tree(V,S)
82 8 A&D: Union-Find
8.1 Die Verwaltung disjunkter Menge