Wie unterscheidet es sich von der asymptotischen Analyse? Wann benutzt du es und warum?
Ich habe einige Artikel gelesen, die gut geschrieben zu sein scheinen, wie diese:
http://www.ugrad.cs.ubc.ca/~cs320/2010W2/handouts/aa-nutshell.pdf
http://www.cs.princeton.edu/~fiebrink/423/AmortizedAnalysisExplained_Fiebrink.pdf
aber ich habe diese Konzepte immer noch nicht vollständig verstanden.
Kann es mir bitte jemand vereinfachen?
algorithm
analysis
amortized-analysis
GrowinMan
quelle
quelle
Antworten:
Die amortisierte Analyse multipliziert nicht naiv die Anzahl der Aufrufe mit dem schlimmsten Fall für einen Aufruf.
Beispielsweise würde eine normale asymptotische Analyse für ein dynamisches Array, dessen Größe sich bei Bedarf verdoppelt, nur zu dem Schluss führen, dass das Hinzufügen eines Elements O (n) kostet, da möglicherweise alle Elemente vergrößert und in das neue Array kopiert werden müssen. Bei der amortisierten Analyse wird berücksichtigt, dass zum Wachstum n / 2 Elemente hinzugefügt werden müssen, ohne dass seit dem vorherigen Wachstum ein Wachstum verursacht wurde. Das Hinzufügen eines Elements erfordert also nur O (1) (die Kosten für O (n) betragen über n / 2 Aktionen abgeschrieben ).
Die amortisierte Analyse ist nicht dasselbe wie eine "durchschnittliche Leistung" - die amortisierte Analyse gibt eine harte Garantie dafür, was die Leistung tun wird, wenn Sie so viele Aktionen ausführen.
quelle
Es gibt viele Antworten auf "was", aber keine auf "warum".
Wie alle anderen gesagt haben, geht es bei der asymptotischen Analyse darum, wie die Leistung einer bestimmten Operation auf einen großen Datensatz skaliert wird. Bei der amortisierten Analyse geht es darum, wie der Durchschnitt der Leistung aller Vorgänge in einem großen Datensatz skaliert. Amortisierte Analysen ergeben niemals schlechtere Grenzen als asymptotische und manchmal viel bessere.
Wenn Sie sich mit der Gesamtlaufzeit eines längeren Jobs befassen, sind Ihnen wahrscheinlich die besseren Grenzen der amortisierten Analyse wichtig. Aus diesem Grund erweitern Skriptsprachen (zum Beispiel) häufig gerne Arrays und Hash-Tabellen um einen gewissen Faktor, obwohl dies eine teure Operation ist. (Das Wachsen kann eine
O(n)
Operation sein, aber amortisiert ist,O(1)
weil Sie es selten tun.)Wenn Sie in Echtzeit programmieren (einzelne Vorgänge müssen in einer vorhersehbaren Zeit abgeschlossen sein), spielen die besseren Grenzen der amortisierten Analyse keine Rolle. Es spielt keine Rolle, ob die Operation im Durchschnitt schnell war, ob Sie sie nicht rechtzeitig beendet haben, um zurück zu kommen und die Bandsäge einzustellen, bevor sie zu weit geschnitten hat ...
Welches in Ihrem Fall wichtig ist, hängt genau von Ihrem Programmierproblem ab.
quelle
Asymptotische Analyse
Dieser Begriff bezieht sich auf die Analyse der Algorithmusleistung unter der Annahme, dass die Daten, mit denen der Algorithmus arbeitet (die Eingabe ), für Laien "groß genug sind, dass eine Vergrößerung die Schlussfolgerung nicht ändert". Obwohl die genaue Größe der Eingabe nicht angegeben werden muss (wir brauchen nur eine obere Schranke), der Datensatz selbst hat angegeben werden.
Beachten Sie, dass bisher haben wir nur über die gesprochene Methode der Analyse; Wir haben nicht genau angegeben, welche Größe wir analysieren (Zeitkomplexität? Raumkomplexität?), und wir haben auch nicht angegeben, an welcher Metrik wir interessiert sind (Worst Case? Best Case? Durchschnitt?).
In der Praxis bezieht sich der Begriff asymptotische Analyse üblicherweise auf die zeitliche Komplexität der Obergrenze eines Algorithmus, dh die Leistung im ungünstigsten Fall, gemessen anhand der Gesamtlaufzeit, die durch die Big-Oh-Notation dargestellt wird (z. B. ein Sortieralgorithmus
O(nlogn)
).Amortisierte Analyse
Dieser Begriff bezieht sich auf die Analyse der Algorithmusleistung basierend auf einer bestimmten Abfolge von Operationen, die auf das Worst-Case-Szenario abzielen. Das heißt, eine amortisierte Analyse impliziert, dass die Metrik die Worst-Case-Leistung ist (obwohl immer noch nicht angegeben ist, welche Menge gemessen wird ). Um diese Analyse durchzuführen, müssen wir die Größe der Eingabe angeben , aber wir müssen keine Annahmen über ihre Form treffen.
Für Laien bedeutet die amortisierte Analyse, eine beliebige Größe für die Eingabe auszuwählen und dann den Algorithmus "durchzuspielen". Immer wenn eine Entscheidung getroffen werden muss, die von der Eingabe abhängt, wird der schlechteste Weg eingeschlagen¹. Nachdem der Algorithmus vollständig ausgeführt wurde, teilen wir die berechnete Komplexität durch die Größe der Eingabe, um das Endergebnis zu erhalten.
¹note: Um genau zu sein, der schlechteste Weg , der theoretisch möglich ist . Wenn Sie einen Vektor haben, dessen Größe sich jedes Mal dynamisch verdoppelt, wenn seine Kapazität erschöpft ist, bedeutet "Worst Case" nicht, dass er sich bei jeder Einfügung verdoppeln muss, da die Einfügungen als Sequenz verarbeitet werden. Wir dürfen (und müssen) bekannten Zustand verwenden , um so viele "noch schlimmere" Fälle wie möglich mathematisch zu eliminieren, auch wenn die Eingabe unbekannt bleibt.
Der wichtigste Unterschied
Der entscheidende Unterschied zwischen asymptotischer und amortisierter Analyse besteht darin, dass die erstere von der Eingabe selbst abhängt, während die letztere von der Abfolge der Operationen abhängt, die der Algorithmus ausführen wird.
Deshalb:
quelle
O(1)
.Die Antwort darauf wird im ersten Satz des Kapitels Amortisierte Analyse im Buch - Einführung in Algorithmen kurz und bündig definiert:
Wir stellen die Komplexität des Wachstums eines Programms durch eine asymptotische Analyse dar, die das Wachstum des Programms durch eine Funktion begrenzt und den schlechtesten, besten oder durchschnittlichen Fall davon definiert.
Dies kann jedoch in Fällen irreführend sein, in denen es nur einen Fall gibt, in dem die Komplexität des Programms einen Höhepunkt erreicht, das Programm jedoch im Allgemeinen nicht viel Rechenaufwand erfordert.
Daher ist es sinnvoller, die Kosten über eine Folge von Operationen zu mitteln, obwohl eine einzelne Operation teuer sein kann. Dies ist eine amortisierte Analyse!
Die amortisierte Analyse ist eine Alternative zur asymptotischen Technik zur Berechnung der Komplexität. Es hilft uns, eine echte Komplexität in Bezug auf die Praktikabilität zu berechnen, um zwei oder mehr Algorithmen zu vergleichen und zu entscheiden.
quelle
Die beste Referenz, die ich bisher zum Verständnis der amortisierten Analyse von Algorithmen gefunden habe, ist das Buch Einführung in Algorithmen , dritte Ausgabe, Kapitel 17: "Amortisierte Analyse". Es ist alles da, viel besser erklärt als das, was in einem Stapelüberlauf-Beitrag zu finden ist. Sie finden das Buch in der Bibliothek jeder anständigen Universität.
quelle
Bei der regelmäßigen asymptotischen Analyse wird die Leistung einer einzelnen Operation asymptotisch in Abhängigkeit von der Größe des Problems untersucht. Die O () - Notation weist auf eine asymptotische Analyse hin.
Die amortisierte Analyse (bei der es sich auch um eine asymptotische Analyse handelt) untersucht die Gesamtleistung mehrerer Operationen an einer gemeinsam genutzten Datenstruktur .
Der Unterschied besteht darin, dass eine amortisierte Analyse typischerweise beweist, dass die für M Operationen erforderliche Gesamtberechnung eine bessere Leistungsgarantie aufweist als das M-fache des schlechtesten Falls für die einzelne Operation.
Beispielsweise kann eine einzelne Operation an einem Spreizbaum der Größe N bis zu O (N) Zeit dauern. Eine Folge von M Operationen an einem Baum der Größe N ist jedoch durch die Zeit O (M (1 + log N) + N log N) begrenzt, die ungefähr O (log N) pro Operation beträgt. Beachten Sie jedoch, dass eine amortisierte Analyse viel strenger ist als eine "Durchschnittsfall" -Analyse: Sie beweist, dass jede mögliche Abfolge von Operationen ihren asymptotischen Worst-Case erfüllt.
quelle
Die amortisierte Analyse befasst sich mit den Gesamtkosten über mehrere Durchläufe der Routine und den Vorteilen, die darin erzielt werden können. Zum Beispiel kann das Durchsuchen eines unsortierten Arrays von n Elementen nach einer einzelnen Übereinstimmung bis zu n Vergleiche erfordern und ist daher o (n) komplex. Wenn wir jedoch wissen, dass dasselbe Array nach m Elementen durchsucht wird, hätte das Wiederholen der Gesamtaufgabe die Komplexität O (m * n). Wenn wir das Array jedoch im Voraus sortieren, betragen die Kosten O (n log (n)), und bei aufeinanderfolgenden Suchvorgängen wird nur O (log (n)) für ein sortiertes Array benötigt. Somit betragen die amortisierten Gesamtkosten für m Elemente, die diesen Ansatz verfolgen, O (n * log (n) + m * log (n)). Wenn m> = n ist, entspricht dies O (n log (n)) durch Vorsortierung im Vergleich zu O (n ^ 2) für Nicht-Sortierung. Somit sind die fortgeführten Anschaffungskosten günstiger.
Einfach ausgedrückt, wenn wir etwas früher ausgeben, können wir später viel sparen.
quelle