Was ist eine amortisierte Analyse von Algorithmen? [geschlossen]

81

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:

aber ich habe diese Konzepte immer noch nicht vollständig verstanden.

Kann es mir bitte jemand vereinfachen?

GrowinMan
quelle
5
Gehört
2
@lanzz Vielleicht würde es jetzt zu cs.stackexchange.com
nbro
Ein großartiger Thread zur Bedeutung der konstanten amortisierten Zeit .
RBT

Antworten:

84

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.

Harold
quelle
1
"Die amortisierte Analyse berücksichtigt, dass, um wachsen zu müssen, n / 2 Elemente hinzugefügt werden müssen, ohne ein Wachstum seit dem vorherigen Wachstum zu verursachen. Das Hinzufügen eines Elements erfordert also wirklich nur O (1) (die Kosten von O (n)). wird über n / 2 Aktionen abgeschrieben). " Das war ziemlich verwirrend und unklar.
AleksandrH
@AleksandrH einen bestimmten Teil davon?
Harold
Ja, es ist nur schwer, der Mathematik zu folgen, ohne zu erklären, woher die Zahlen kommen
AleksandrH
43

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.

Übrigens
quelle
1
"Das Wachsen kann eine O (n) -Operation sein, aber amortisiert ist O (1), weil Sie es selten tun." Ich denke, diese Aussage braucht wirklich einen strengen mathematischen Beweis.
nbro
"Wenn Sie in Echtzeit programmieren ..." sollten Sie genauer sein und genau erklären, warum dieser Absatz als "wahr" angesehen werden sollte.
nbro
1
@nbro Warum denkst du "sollte"? In der Frage wird gefragt, wie sich die amortisierte Analyse von der asymptotischen unterscheidet und wann Sie sie verwenden möchten. Es enthält Links zu Artikeln, in denen die Vorgehensweise erläutert wird. Die mathematische Analyse erscheint also überflüssig. Wie für die Echtzeit - Programmierung, ich habe es erklären. Echtzeitprogrammierung ist eine Programmierung, bei der einzelne Vorgänge in einer vorhersehbaren Zeit abgeschlossen werden müssen. Ein typisches Beispiel ist die eingebettete Programmierung, bei der Sie in regelmäßigen Abständen etwas überwachen müssen. Wie die Steuerung von Maschinen. In diesem Fall sind gelegentliche langsame Operationen nicht akzeptabel.
Btilly
25

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:

  • Die asymptotische Analyse erlaubt es uns zu behaupten, dass die Komplexität des Algorithmus, wenn ihm eine Eingabe für den besten / schlechtesten / durchschnittlichen Fall einer Größe nahe N gegeben wird, durch eine Funktion F (N) begrenzt ist - wobei N eine Variable ist
  • Die amortisierte Analyse ermöglicht es uns zu behaupten, dass die Komplexität des Algorithmus, wenn er eine Eingabe mit unbekannten Merkmalen, aber bekannter Größe N erhält, nicht schlechter ist als der Wert einer Funktion F (N) - wobei N ein bekannter Wert ist
Jon
quelle
7
Die obige Antwort zeigt, warum Menschen lange Antworten von hochrangigen Personen nicht blindlings positiv bewerten sollten.
Btilly
2
@btilly: Ihr Feedback wäre viel nützlicher, wenn es umsetzbar wäre. Können Sie mir eine Vorstellung davon geben, was genau an dieser Antwort falsch ist und wie Sie sie verbessern können?
Jon
7
wo soll ich anfangen Sie haben beide Begriffe falsch definiert und viele klarstellende Details angegeben, die ebenfalls falsch waren. Für ein zufälliges Beispiel ist eine amortisierte Analyse nicht immer der schlechteste Fall. Andernfalls können wir nicht sagen, dass die amortisierte Leistung beim Einfügen in einen dynamisch geänderten Hash gleich ist O(1).
Btilly
@btilly CLRS Seite 451 sagt: "... eine amortisierte Analyse garantiert die durchschnittliche Leistung jeder Operation im schlimmsten Fall."
Glen Selle
1
@GlenSelle Amortisierte Analyse ist eine mathematische Technik. Es kann für eine Vielzahl von Zwecken verwendet werden, einschließlich der Leistung im ungünstigsten Fall. Es muss jedoch nicht der schlimmste Fall sein. In Ihrem Fall wurde es anscheinend für den schlimmsten Fall verwendet. Im Falle von Hashing war es nicht.
Btilly
14

Die Antwort darauf wird im ersten Satz des Kapitels Amortisierte Analyse im Buch - Einführung in Algorithmen kurz und bündig definiert:

In einer amortisierten Analyse wird die Zeit, die zum Ausführen einer Folge von Datenstrukturoperationen erforderlich ist, über alle durchgeführten Operationen gemittelt.

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.

Kunal Vyas
quelle
5

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.

Óscar López
quelle
Ja. Das Lesen über den amortisierten Algorithmus aus dem erwähnten Buch war besser und gab schließlich Klarheit.
Rajesh Mappu
2

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.

kommender Sturm
quelle
1

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.

SmacL
quelle