Also wir stellen jetzt das, was wir anhand von zwei Beispielen,
die wir in den letzten beiden Sitzungen gemacht haben, mal auf etwas formalere Füße.
Das heißt, wir verwandeln es von ad hoc-rumstochern in eine Methode, die sogenannte Potentialmethode.
Wir müssen dazu einiges an dem, was wir da im allgemeinen Rahmenwerk von algorithmischen
Heritten hatten, etwas formalisieren. Und zwar definieren wir mal kurz formal, was wir also
unter diesen Operationen verstehen, von denen wir uns Sequenzen ansehen, die dann in amortisiert
so und so langer Zeit laufen sollen. Dazu muss man erstens reden über Zustände,
die von diesen Operationen transformiert werden.
Zustände sind aber einfach Werte der globalen Variablen des Ganzen. Wir stellen uns immer
vor, wir haben eine Datenstruktur, die ist beschrieben durch irgendwelche globalen
Variablen und die ändern sich. Der jeweilige Inhalt dieser globalen Variablen,
den nennen wir Zustand. Nehmen wir aber als Beispiel hier dieses unbeschränkte Array,
das wir implementiert haben, was ist da der Zustand. Da gab es eine Variable n, das war
die Füllhöhe des Arrays im Moment, dann gab es W, das ist die Gesamtgröße gerade
alloziert des Arrays und dann gab es noch seinen tatsächlichen Inhalt. Und diese drei
Größen zusammen, die bestimmen halt den aktuellen Zustand. Die Menge dieser Zustände,
die kriegt einen Namen, die heißt Groß S. Und dann zeichnen wir noch einen besonderen
Zustand S0 in S aus. Das ist der Anfangszustand. Was war der Anfangszustand bei unserem unbeschränkten
Array? Es war dieser hier, 0 ist die Füllhöhe, 1 ist der insgesamt allozierte Platz und
naja, der tatsächliche Inhalt des Arrays ist natürlich auch einfach eine leere Liste
von Werten, weil wir keinen Inhalt haben. Gut. Ja, das sind Zustände und da auf diesen
Zuständen agieren Operationen. Als typischen Namen für so eine allgemeine Operation verwende
ich Groß X. So, und diese Operation, wenn ich sie ausführe, bewirken Zustandsübergänge.
Was sie tun, hängt natürlich vom aktuellen Zustand ab und abhängig von diesem aktuellen
Zustand liefern sie einen neuen Zustand. So, die schreiben wir so. Schreiben wir so ein
Pfeil zwischen zwei Zuständen, schreiben das X über den Pfeil und typischerweise nennen
wir den Nachzustand S'. Das ist ohnehin eine übliche Konvention, dass man Dinge, die nach
einer Operation vorliegen, mit einem Strich bezeichnet. Und die haben Kosten. Und die Kosten,
die hängen natürlich einerseits von der Operation und andererseits vom aktuellen
Zustand ab. Zum Beispiel könnte, wenn ich ein Pushback durchführe, der aktuelle Zustand
gerade so sein, dass ich neuen Platz alluzieren muss, dann dauert es sehr lange. Das bezeichnen
wir mit T index X von S. Und das S ist nicht umsonst dasselbe wie hier. Ja, also die Kosten,
die messen wir also in Abhängigkeit vom Ausgangszustand, nicht vom Zustand, der dann erreicht wird.
Ja, nehmen wir mal wieder ein Beispiel. Nehmen wir also eine Pushbackoperation. Gut, die sollte
irgendein Argument haben, aber das Argument interessiert mich nicht. So, die bewirkt einen
Zustandsübergang von N, W und irgendwelchem Inhalt. Der Inhalt ist für die ganze Rechnung
wie immer egal. Und da kommt raus im Normalfall, im Normalfall heißt ohne reallocate, N plus
W. Also es wird ein weiteres Element ins Array geschrieben, der Füllstand erhöht sich um
eins, W bleibt unverändert und dann kommt hier noch der neue Inhalt, der wie gesagt
für die meisten Betrachtungen egal ist. So, das ganze also falls N kleiner W, das ist
die formale Bedingung dafür, dass kein reallocate stattfindet. Wir sehen, der Zustand ist genug,
um tatsächlich auch die wichtigen Informationen zu extrahieren, um zu sehen, wie lange es
dauert. Na ja, die Zeit in diesem Falle T, T von Pushback, also T Pushback von N, W und
W ist egal, ist dann per Konvention einfach gleich eins. Also gut, es geht irgendwie in
konstanter Zeit, welche konstante Zeit das genau ist, ist uns also egal. Gut. Und das,
was uns nachher eigentlich interessiert, also was wir zeitlich messen wollen, sind ja nicht
einzelne Operationen, sondern Sequenzen von Operationen und zwar solche, die beginnen
beim Anfangszustand. Das heißt, als allgemeinen Namen für Sequenzen nehmen wir aus irgendeinem
Grund F. So, ich hoffe, ich halte es durch die Zahloperation mit M weiterhin zu bezeichnen,
also eine Sequenz von M Operationen x1 bis xM. Die bewirken wiederum Zustandsübergänge.
Presenters
Zugänglich über
Offener Zugang
Dauer
01:08:47 Min
Aufnahmedatum
2013-05-24
Hochgeladen am
2019-04-22 03:19:03
Sprache
de-DE
- Mathematische Hilfsmittel der Algorithmenanalyse: Abschätzung des asymptotischen Wachstums von Funktionen, Summationen, Anzahlen, divide-and-conquer-Rekursionen, etc.
-
Grundbegriffe der quantitativen Algorithmenanalyse: worst-case- und average-case-Analsyse, obere und untere Schranken, Algorithmen- und Problemkomplexität
-
Exemplarische Analysen von Sortieralgorithmen
-
Sortierkomplexität und Entropie
-
Quellcodierung und Datenkompression
-
Komplexität von arithmetischen Operationen und Problemen (Multiplikation, Primtest, Faktorisierung)
-
modulare Arithmetik und schnelle Fouriertransformation
-
Kryptographie und Komplexität
Lernziele und Kompetenzen:
Die Studierenden
-
erwerben fundierte Kenntnisse über die Grundbegriffe der quantitativen Algorithmenanalyse (Laufzeit) und die benötigten mathematischen Methoden
-
verstehen die Komplexität (Laufzeitverhalten) von Standardalgorithmen (z.B. Sortieren, arithmetische Algorithmen) und können deren praktische Bedeutung erklären
-
sind in der Lage, an einfachen, exemplarischen Algorithmen Analysen des worst-case-Verhaltens und des average-case-Verhaltens durchzuführen
-
können exemplarisch Algorithmenkomplexität und Problemkomplexität in Bezug setzen
-
können die Beziehungen zwischen Sortier- und Suchkomplexität und dem Entropiebegriff darstellen
-
erwerben Grundkenntnisse über algebraische Strukturen der Arithmetik und die Komplexität arithmetischer Operationen
-
können die Rolle von Komplexitätsaussagen für die Beurteilung der Sicherheit einfacher kryptografischer Protokoll darstellen
Literatur:
Graham, Knuth, Patashnik, Concrete Mathematics, Addison-Wesley, 1994.
Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms, MIT-Press, 2001.
Heun, Grundlegende Algorithmen, Vieweg, 2001.