Amortisierte Analysen

Ähnliche Dokumente
Amortisierte Analysen

Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16

Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 12

Algorithmen und Datenstrukturen

Amortisierte Analyse. C. Komusiewicz 6.1 Amortisierte Analyse: Motivation 105

Algorithmische Intelligenz. Amortisierung. Stefan Edelkamp

Übung zur Vorlesung Berechenbarkeit und Komplexität

Datenstrukturen & Algorithmen Lösungen zu Blatt 4 FS 15

1. Übungsblatt zu Algorithmen II im WS 2011/2012

Informatik II: Algorithmen und Datenstrukturen SS 2015

Algorithmen und Datenstrukturen

ContainerDatenstrukturen. Große Übung 4

Amortisierte Laufzeitanalyse

Vorlesung Algorithmische Geometrie. Streckenschnitte. Martin Nöllenburg INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

a) Fügen Sie die Zahlen 39, 38, 37 und 36 in folgenden (2, 3)-Baum ein:

Übungsklausur Algorithmen I

Amortisierte Analyse

3. Übungsblatt zu Algorithmen I im SoSe 2017

Rekursionsbäume Aufstellen eines Baumes dessen Knoten die Laufzeit auf jeder Rekursionsstufe darstellen und Aufsummieren

Ein sortiertes Feld kann in O(log n) durchsucht werden, z.b. mit Binärsuche. Der Algorithmus 1 gibt den Pseudocode der binären Suche an.

Vorlesung Algorithmische Geometrie. Streckenschnitte. Martin Nöllenburg INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

Vorlesung Algorithmische Geometrie. Streckenschnitte. Martin Nöllenburg INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Algorithm Engineering. Amortisierung. Stefan Edelkamp

Algorithmische Geometrie 3. Schnitte von Liniensegmenten

Multiplikation langer Zahlen

Übungen zu Algorithmentechnik WS 09/10

Die natürlichen Zahlen

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2017/18. Pro f. Dr. Sán do r Fe k e te

Kostenmodell. Daniel Graf, Tobias Pröger. 22. September 2016 (aktualisierte Fassung 5 vom 9. Oktober 2016)

9 Minimum Spanning Trees

. Die obige Beschreibung der Laufzeit für ein bestimmtes k können wir also erweitern und erhalten die folgende Gleichung für den mittleren Fall:

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Heaps. Vorlesung 8: Heapsort (K6) Joost-Pieter Katoen. 7. Mai 2015

2.2. Schnitte von Liniensegmenten

Die natürlichen Zahlen

Übung Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen

(27 - Selbstanordnende lineare Listen)

Übersicht. Datenstrukturen und Algorithmen. Die Teile-und-Beherrsche-Methode. Übersicht. Vorlesung 3: Rekursionsgleichungen (K4)

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

12 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Algorithmen und Datenstrukturen (für ET/IT)

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Datenstrukturen und Algorithmen. Vorlesung 8

Algorithmen und Datenstrukturen I Grundlagen

1. Die rekursive Datenstruktur Liste

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Mehrwegbäume Motivation

Zahlen und metrische Räume

Zahlen. Bernhard Ganter. Institut für Algebra TU Dresden D Dresden

Suchbäume. Suchbäume. Einfügen in Binären Suchbäumen. Suchen in Binären Suchbäumen. Prinzip Suchbaum. Algorithmen und Datenstrukturen

Dies ist gerade der konstruktive Schritt beim Aufbau von Binomialbäumen.

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

Übung zur Vorlesung Algorithmische Geometrie

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

ADS 1: Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

13 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Heute. Medium Access Control / Färbungen, Teil 2. Kapazität & Scheduling. kurze Wiederholung Schöner verteilter Färbungsalgorithmus

Übungsblatt 2 - Lösung

Die Dreiecks Ungleichung: I x + y I I x I + I y I

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Von den rationalen zu den reellen Zahlen

Informatik II, SS 2014

Kapitel 3. Speicherhierachie. Beispiel für Cache Effekte. Motivation Externspeicheralgorithmen. Motivation Für Beachtung von Cache Effekten

Vorlesung Datenstrukturen

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2013 / 2014 Vorlesung 11, Donnerstag, 16.

Algorithmen und Datenstrukturen I. Grundlagen. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Informatik II, SS 2014

Algorithmische Geometrie: Schnittpunkte von Strecken

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min

4.2 Fibonacci-Heaps Aufbau Potenzialfunktion. Knoten v hat folgende Felder:

Sortieren II / HeapSort Heaps

Terme und Gleichungen

2 Wachstumsverhalten von Funktionen

Effizienter Planaritätstest Vorlesung am

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Konstruktion reeller Zahlen aus rationalen Zahlen

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt Semester ARBEITSBLATT 11 GLEICHUNGEN UND ÄQUIVALENZUMFORMUNGEN

Verbund/Struktur (record/struct)

Algorithmen und Datenstrukturen

Zahlen und metrische Räume

Ein Seminarbericht von Johann Basnakowski

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Rotation. y T 3. Abbildung 3.10: Rotation nach rechts (analog links) Doppelrotation y

Übung Algorithmen und Datenstrukturen

Graphdurchmusterung, Breiten- und Tiefensuche

Übungsklausur Algorithmen I

Informatik II Übung 10. Pascal Schärli

Splay-Bäume. Joseph Schröer. Seminar über Algorithmen SoSe 2011, Prof. Dr. Helmut Alt

Fakultät für Informatik und Automatisierung, Technische Universität Ilmenau. Über Polynome mit Arithmetik modulo m.

Grundlagen: Algorithmen und Datenstrukturen

textlichen Problem heraus. Hier folgt nun ein zugegebenermaßen etwas künstliches Problem :

Kap. 4.7 Skiplisten. 14./15. VO DAP2 SS /16. Juni 2009

1,2,3,4,5,... Dabei ist die Reihenfolge wichtig, jede Zahl hat also ihre feste Position. Die Folge 2,1,4,3,... ist eine andere als 1,2,3,4,...

Transkript:

Amortisierte Analysen 26. Mai 2016 1 Einleitung Es gibt viele Datenstrukturen, bei deren Komplexitätsanalyse das Problem auftaucht, dass die Ausführung mancher Operationen Einfluss auf die Komplexität der folgenden Operationen hat (die gleiche oder eine andere). Eine Einfüge- Operation in einem (a, b)-baum kann zum Beispiel sehr viele Split-Operationen verursachen, dies hat den erwünschten Nebeneffekt, dass die folgenden Operationen sehr wahrscheinlich eine niedrigere Komplexität haben werden. In einigen Fällen ist es Sinnvoll nicht den Worstcase von einzelnen Operationen, sondern die Laufzeit von einer Folge von Operationen zu betrachten. Ein Werkzeug für solche Fälle ist die amortisierte Analyse. 2 Amortisierte Analyse Die Idee der amortisierten Analyse ist es, zeitintensive Operationen gegen weniger zeitintensive Operationen aufzuwiegen. Unter Umständen kann dieses Aufwiegen dann in eine schärfere Laufzeitabschätzung resultieren. 2.1 Die Bankkontomethode Die Idee hinter der Bankkontomehode ist sehr einfach: Bei den Operationen die nicht so viel Zeit benötigen, stellen wir uns vor, dass sie mehr Zeit beanspruchen würden. Die Zeit, welche wir nicht gebraucht haben, speichern wir als Rücklage auf einem Konto. Wenn also später eine Operation durchgeführt wird, die länger braucht, so gönnen wir uns aufgesparte Zeit vom Konto. Dies ist Zeit die wir für die Komplexität berechnet aber nicht wirklich gebraucht haben. Diese Methode isntuitiv leicht zu fassen, nur ist sie in dieser Form mathematisch zu ungenau. Eine genauere Formulierung (und damit ein Werkzeug für den formalen Beweis!) kann mit Hilfe der Potentialfunktion geschehen. 2.2 Die Potenzialfunktionmethode Ziel dieser Methode ist es, eine sogenannte Potenzialfunktion Φ(i) zu finden, welche einer Datenstruktur zum Zeitpunk einen bestimmten Wert (ein Potenzial) zuordnet. Jede Operation {O 1,..., O k } hat einen (evtl. vom Zeitpunkt abhängigen) Aufwand {T 1,..., T k }. Man versucht nun die Potenzialfunktion so zu wählen, dass man für jede Operation die reellen Kosten, welche die 1

Operation im i-ten Schritt verursacht, gegen eine amortisierte Schranke a i abzuschätzen: + Φ(i) Φ(i 1) a i Dabei ist Φ(i) Φ(i 1) die Änderung des Potenzials der Datenstruktur: Φ(i 1) ist der Kontostand vor und Φ(i) nach dem jetzigen Schritt. Wenn also Φ(i) negativ ist, wurde etwas aus dem Konto genommen, sonst wurde zum Konto hizugefügt. Nachdem man für alle möglichen k Operationen nun amortisierte Kostenschranken a 1,..., a k gefunden hat, kann man sich Gedanken über die Kosten von n gemischten Operationen machen: Sei hierzu A das maximum von a 1,..., a n. ( + Φ(i) Φ(i 1)) = Φ(n) Φ(0) + a i n A Diese Abschätzung gilt natürlich nur wenn Φ(0) = 0 und Φ(n) Φ(0) 0: Am Anfang muss das Konto leer sein da wir nur was auf dem Konto hinzufügen dürfen wenn dadurch eine Operation teurer wird. Am Ende darf der Kontostand nicht negativ sein, da wir nicht mehr als wir hinzugefügt haben abziehen dürfen. Was hier geschiehst, dass der Aufwand von komplexen Operationen auf einfachere Operationen abgewälzt wird. Wir addieren also zu den schnellen Operationen etwas hinzu während wir von den langsamen etwas subtrahieren mit dem Ziel zu einer glatteren Schranke zu kommen. Mit anderen Worten wird der je nach Operation stark schwankende Aufwand durch die amortisierten Kosten a i abgeschätzt. Zentrales Problem ist natürlich die Potenzialfunktion. Nur wie findet man sie? Ein paar Tipps: Die Potenzialfunktion ist abhängig von i. Das bedeutet aber nicht, dass die Zahl i in der Funktion vorkommen muss. Das Argumen symbolisiert lediglich die wievielte Operation gerade betrachtet wird. Als Grundlage der Potenzialfunktion dienen alle Werte die sich aus dem Zeitpunk ableiten oder schätzen lassen, so wie z.b.: Wie viele Schritte schon gemacht wurden, wie viele Elemente eingefügt wurden, die Höhe eines Baumes, Anzahl der Rotationen seit dem letzten Einfügen, etc. Es ist oft nützlich, dass in der Beschreibung der Potenzialfunktion das Wort seit auftaucht, vor allem in Datenstrukturen, in denen sich bestimmte Vorgänge wiederholen. Es ist also prinzipiell eine gute Idee zu beobachten, wann in der Datenstruktur etwas besonderes geschieht und dieses dann durch die Potenzialfunktion mit der Anzahl der Operationen oder dem Zustand der Datenstruktur an einem bestimmten Zeitpunkn Verbindung zu bringen. Die Potenzialfunktion addiert normalerweise ein Bisschen zu schnellen Operationen und subtrahiert viel von langsamen. Wobei hier viel und Bisschen zu definieren ist. 2

Ein Indiz für eine richtige Potenzialfunktion ist, dass die Potentialdifferenz für die aufwendigen Operationen negativ, für die günstigen positiv (oder Null) wird. 3 Beispiele 3.1 Binär Baum mit lazy-insert Wir betrachten die folgende Datenstruktur: Einen binären Baum und eine Queue. Anstatt die Elemente in den Baum direkt einzufügen, fügen wir sie (in konstanter Zeit) in die Queue ein. Suchen und löschen führen wir auf dem Baum aus, dabei müssen wir allerdings die Elemente in der Queue beachten. Sollte diese nicht leer sein Fügen wir jedes element aus der Queue in den Baum ein. Der letzte Schritt hat eine Worstcase Laufzeit von O(n log n), somit hätten n beliebige Operationen eine Worstcase Laufzeit von O(n 2 log n). Da dieser teure Fall aber nicht oft auftreten kann wollen wir uns der amortisierten Analyse bedienen. Suchen wir zunächst die Potenzialfunktion. Wenn man die Datenstruktur näher betrachtet, sieht man, dass nach einer langsamen Operation (Suchen oder Löschen) die Queue wieder die Länge 0 hat. Wir sollten versuchen, dass bei diesen langsamen Operationen durch die Addition von Φ(i) viel abgezogen wird, um somit die amortisierten Kosten der langsamen Operationen nach unten zu drücken. Man sieht, dass die Länge der Queue zum Zeitpunk 1 (vorher) groß und zum Zeitpunk (nachher) wieder 0 ist, da eine solche Operation die Queue leert. Wir folgern: Die größe der Queue sollte in die Potenzialfunktion mit einfließen. Versuchen wir einmal als Ansatz folgende Potenzialfunktion: Φ(i) = c l i log n i Hier ist l i die Länge der Queue, n i die Anzahl der Elemente in der Datenstruktur und c eine geeignete Konstante (diese dient als Hilfe um Arithmetik in der O-Notation betreiben zu können). Jetzt können wir die amortisierten Kosten für das Suchen und Löschen in der Datenstruktur abschätzen: Suchen / Löschen O(log n i ) + Queue Baum O(l i 1 log n i ) } {{ } + c 0 log n i Φ(i)=0 c l i 1 log(n i 1 ) = O(log n i ) Hier zeigt sich der Grund für die Wahl des Logarithmus in der Potenzialfunktion: Sie kann mit den reellen Kosten (in denen eben ein Logarithmus zu finden ist) verrechnet werden. Der O-Term in der Ungleichung lässt sich mit geeigneter Wahl für c nun ebenfalls abschätzen (Das wählbare c ist eigentlich auch in der O- Klasse versteckt, allerdings schreibt man es hier bekanntlich nicht mit hin). Das ist bisher ein sehr gutes Ergebnis. Wir haben die Operationen mit der höchsten Komplexität und einem genügend großem c durch O(log n) abgeschätzt. Bleibt zu prüfen, was beim Einfügen passiert: 3

Einfügen O(1) + c l i log n i Φ(i) c l i 1 log(n i 1) = O(log n i ) Da n i n gilt kann man jeden Term mit O(log n) abschätzen, wenn das c entsprechend gewählt wird. Für die Kosten von n gemischten Operationen folgt dann: Φ(n) Φ(0) + a i = n O(log n) Damist gezeigt, dass bei der Datenstruktur n gemischte Operationen eine Komplexität von O(n log n) haben und eine Operation im amortisierten Mittel eine Komplexität von O(log n) besitzt. Überlegen wir kurz, was passiert wäre, wenn wir eine andere (größere) Potenzialfunktion gewählt hätten, etwa Φ(i) = c l i n i Dann gilt für das Suchen und Löschen: Suchen / Löschen O(log n i ) + Queue Baum O(l i 1 log n i ) } {{ } + c 0 n i Φ(i)=0 c l i 1 n i 1 < 0 Allerdings funktioniert diese Funktion nicht für das Einfügen: O(1) + c l n i c (l i 1) (n i 1) = Ω(n i ) Also war diese zweite Potenzialfunktion wirklich zu groß. 3.2 Stacks mit Multipop Jetzt betrachten wir einen Stack mit den Operationen Push und Pop. Erweitert wird die bekannte Datenstruktur mit der Funktion Multipop(k), welche die obersten k Elemente vom Stack entfernt, also prinzipiell so wirkt wie ein k- maliger Aufruf von Pop. Die langsame (und somit teure) Operation isn dieser Datenstruktur das Multipop, also wollen wir überlegen, wie wir die amortisierten Kosten dafür reduzieren können. Wir sehen direkt, dass sich die Anzahl der Elemente bei einem Multipop im Vergleich zu den anderen Operationen stark verringert. Demzufolge sollten wir als Ansatz für die Potenzialfunktion die Anzahl der Elemente auf dem Stack wählen, also: 4

Φ(i) = c s i Wobei s i die größe des Stacks zum Zeitpunk ist und c eine geeignete Konstante. Wir definieren uns t push, t pop und t multipop(k) als die reellen Kosten von den Operationen Push, Pop und Multipop(k). Probieren wir mal eine amortisierte Schranke zu finden, falls Push die Operation im i-ten Schritst: t push + Φ(i) Φ(i 1) =c s i =c (s i 1) = O(1) + c s i c (s i 1) = O(1) Die amortisierten Kosten für ein Push sind also konstant. Jetzt widmen wir uns dem Fall, das Pop die i-te Operation ist: t pop + Φ(i) Φ(i 1) =c s i =c (s i+1) = O(1) + c s i c (s i + 1) 0 Wichtig ist zu beobachten, dass sich die Anzahl der Elemente s i auf dem Stack mit einem Push vergrößert und mit einem Pop verkleinert! Die letzte Operation die wir uns anschauen müssen ist das Multipop(k). Hier werden k Elemente vom Stack entfernt. Falls sich weniger Elemente auf dem Stack befinden (s i k) als gelöscht werden sollen, terminiert die Funktion wenn der Stack leer ist, also nach s i Schritten. Da im Zweifelsfall also der Aufwand für Multipop(k) geringer wird, können wir davon ausgehen das genug Elemente auf dem Stack sind (wir suchen ja schließlich nach einem Worstcase). Überprüfen wir also die amortisierte Schranke für Multipop(k): t multipop(k) + Φ(i) Φ(i 1) =c s i =c (s i+k) = O(k) + c s i c (s i + k) 0 Jetzt wissen wir, dass wir alle möglichen Operationen zu jedem möglichen Zeitpunkt durch die amortisierte obere Schranke a i O(1) abschätzen können. Also gilt für eine Folge von n gemischten Operationen: Φ(n) Φ(0) + 0 a i O(1) = O(n) Wichtig ist wie immer, dass Φ(0) = 0 ist 1 und zusätzlich für alle n N gilt Φ(n) Φ(0), denn sonst würde die letzte Abschätzung nicht funktionieren. Wir haben also mit Hilfe einer amortisierten Analyse gezeigt, dass eine Operation auf einem solchen Stack durch die mittleren Kosten in Höhe von O(1) beschränkt ist. 1 Wir gehen davon aus, dass wir mit einem leeren Stack beginnen. 5