Was macht eine Zeiteinheit in der Laufzeitanalyse aus?

8

Welche Berechnungen werden bei der Berechnung der Laufzeitabhängigkeit von der Eingabe berücksichtigt? Ich glaube zum Beispiel, dass ich gelernt habe, dass Array-Indizierung und Zuweisungsanweisungen nicht gezählt werden. Warum ist das so?

Raphael
quelle

Antworten:

6

Bei Komplexitätsberechnungen verwenden wir im Allgemeinen das RAM-Modell . In diesem Modell nehmen wir an, dass die Array-Indizierung O (1) ist. Die Zuweisungsanweisung entspricht dem Zuweisen eines Werts zu einer Variablen im Array von Variablen . Dies dient nur der Bequemlichkeit. Es vereinfacht die Analyse des Algorithmus. In der realen Welt benötigt die Array-Indizierung O (log I), wobei I die Anzahl der indizierten Dinge ist.

Wir betrachten im Allgemeinen Dinge, die von der Größe der Eingabe abhängen, z. B. Schleifen. Selbst wenn sich in der Schleife eine O (1) -Operation befindet und diese n-mal ausgeführt wird, wird der Algorithmus für die O (n) -Zeit ausgeführt.

Der Betrieb von O (1) außerhalb der Schleife dauert jedoch nur konstant und O (n) + O (1) = O (n).

Lesen Sie mehr über den Radix-Sortieralgorithmus von CLRS.

Pratik Deoghare
quelle
Was ist mit Inkrementen in einer Schleife? Das sollte O (n) sein, oder?
für (int k = 0; k <N; k ++) {sum = summe + werte [k];} Ist der fragliche Code. Es wurde gesagt, 3N + 2 Anrufe zu tätigen.
Nee. Für sum = sum + values ​​[k] ist + O (1) und = ist auch O (1). Die Schleife läuft jedoch O (N) mal . Also ist sein O (N) * O (1 + 1) = O (N). O (3N + 2) Anrufe sind nur O (N).
Pratik Deoghare
Aber warum sind es O (3N + 2) Anrufe?
Der Zugriff auf den Wert [k] ist 1 Aufruf. + ist 1 Anruf. = ist 1 Anruf. Das erklärt 3 Anrufe, die N-mal getätigt wurden, aber ich weiß nichts über +2.
Pratik Deoghare
5

Das ultimative Ziel ist "Ausführungszeit in Sekunden" oder allgemeiner (ohne Berücksichtigung moderner CPU-Funktionen) "Anzahl der Taktzyklen". Wie sich herausstellt, ist dies schwer zu analysieren und es ist auch maschinen- oder zumindest befehlssatzspezifisch. Daher wird es normalerweise nicht gemacht.

Die nächste Abstraktionsebene besteht darin, alle Operationen (eines Pseudocodes im Assembly-Stil) genau zu zählen und die einzelnen Operationskosten (in Taktzyklen) als Parameter beizubehalten. Beachten Sie, dass eine solche Analyse unter anderem in Knuths "The Art of Computer Programming" zu finden ist. Es gibt also sicherlich einen Platz für diese Art von Ansatz, auch wenn es schwierig ist und bei Vorhandensein einer Speicherhierarchie tendenziell schwieriger ist.

Last but not least - und sicherlich am wichtigsten - ist die Analyse dominanter Operationen, bei der konstante Faktoren ignoriert werden und asymptotisch verschwindende Konstributionen ("O

Viele Algorithmen lassen "klassische" Frameworks hinter sich und werden von Speicher- und / oder Kommunikationskosten dominiert. In diesem Fall werden also die Anzahl und das Volumen der Speicherzugriffe gezählt. Netzwerkübertragungen sind angemessen (und möglicherweise ausreichend).

Denken Sie außerdem daran, dass wir oft nicht so sehr an der absoluten Leistung eines Algorithmus interessiert sind, sondern daran, ihn mit anderen zu vergleichen. Auch dies kann die Wahl des analysierten Parameters beeinflussen.

Sie sehen, es gibt keine eindeutige Antwort. Abhängig von den Zielen der vorliegenden Analyse können unterschiedliche Antworten gegeben werden.

Siehe auch meine Antwort hier für einige verwandte Gedanken und Sebastians Antwort auf Quicksort als Beispiel.

Raphael
quelle
Ich bin nicht damit zufrieden zu sagen, dass der bekannteste Ansatz, den Sie erwähnen, vollständig vom RAM-Modell abgedeckt wird: Das RAM-Modell berücksichtigt normalerweise keine einheitlichen Kosten für die Multiplikation (um die Äquivalenz von Problemen zu erhalten, die von TMs in Mehrfachzeit mit Problemen gelöst werden können lösbar durch RAMs in Poly-Time). Es wird jedoch normalerweise angenommen, dass die Multiplikation bei der Analyse vieler Algorithmen eine konstante Zeit kostet
Cornelius Brand,
@cbra: Ich habe kein RAM-Modell mit einheitlichen Kosten für alles außer Multiplikation gefunden. Insbesondere ist es für die Polyzeitäquivalenz nicht erforderlich.
Raphael
2(2n)O(n)
@cbra Du scheinst da einen Punkt zu haben. Das RAM-Modell in "reiner" Form bietet keine Multiplikation als atomare Aktion, sondern implementiert sie durch wiederholtes Addieren. Daher sind einheitliche Kosten für die Multiplikation (und möglicherweise andere Operationen) insofern "gefährlich", als sie bestimmte Beziehungen unterbrechen, wenn sie auf Probleme angewendet werden, bei denen die Anzahl groß wird (dh größer als die Eingabe (?)).
Raphael