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?
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?
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.
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.
quelle