Nein, Ihr Code hat eine zeitliche Komplexität von O(2^|<DeltaTime>|)
,
Für eine korrekte Codierung der aktuellen Zeit.
Bitte, lassen Sie mich zuerst für mein Englisch entschuldigen.
Was ist und wie funktioniert Big O in CS?
Die Big O-Notation wird nicht verwendet, um die Eingabe eines Programms mit seiner Laufzeit zu verknüpfen .
Die Big-O-Notation ist eine Möglichkeit, das asymptotische Verhältnis zweier Größen auszudrücken .
Bei der Algorithmusanalyse sind diese beiden Größen nicht die Eingabe (für die man zuerst eine "Mess" -Funktion haben muss) und die Laufzeit.
Sie sind die Länge der Codierung einer Instanz des Problems 1 und eine interessierende Metrik.
Die am häufigsten verwendeten Metriken sind
- Die Anzahl der Schritte, die erforderlich sind, um den Algorithmus in einem bestimmten Berechnungsmodell zu vervollständigen.
- Der Platz, den das Berechnungsmodell benötigt, wenn ein solches Konzept vorhanden ist.
Implizit ist eine TM als Modell angenommen , so dass der erste Punkt zur übersetzten Anzahl von Anwendungen der Übergang 2 - Funktion , dh „Stufen“, und die zweiter übersetzt die Anzahl der verschiedenen Band Zellen mindestens einmal geschrieben .
Wird auch oft implizit angenommen, dass wir anstelle der ursprünglichen Codierung eine polynomiell verwandte Codierung verwenden können, beispielsweise ist eine Funktion, die ein Array von Anfang bis Ende durchsucht, O(n)
komplex, obwohl eine Codierung einer Instanz eines solchen Arrays eine Länge von haben sollte n*b+(n-1)
wo b
ist die (konstante) Anzahl von Symbolen jedes Elements. Dies liegt daran, b
dass eine Konstante des Berechnungsmodells und damit der Ausdruck über und betrachtet wirdn
asymptotisch gleich ist.
Dies erklärt auch, warum ein Algorithmus wie die Trial Division ein exponentieller Algorithmus ist, obwohl er im Wesentlichen ein for(i=2; i<=sqr(N); i++)
ähnlicher Algorithmus 3 ist .
Sehen Sie das .
Dies bedeutet auch, dass die Big-O-Notation möglicherweise so viele Parameter verwendet, wie zur Beschreibung des Problems erforderlich sind. Ist es nicht ungewöhnlich, dass für einige Algorithmen ein k- Parameter vorhanden ist?
Es geht also nicht um die "Eingabe" oder "es gibt keine Eingabe".
Studienfall jetzt
Die Big O-Notation stellt Ihren Algorithmus nicht in Frage, sondern setzt lediglich voraus, dass Sie wissen, was Sie tun. Es ist im Wesentlichen ein Werkzeug, das überall anwendbar ist, selbst für Algorithmen, die absichtlich schwierig sein können (wie bei Ihnen).
Um Ihr Problem zu lösen, haben Sie das aktuelle und ein zukünftiges Datum verwendet. Sie müssen also irgendwie Teil des Problems sein. Einfach ausgedrückt: Sie sind Teil der Instanz des Problems.
Insbesondere lautet die Instanz:
<DeltaTime>
Wo das <>
bedeutet, eine nicht pathologische Kodierung der Wahl.
Siehe unten für sehr wichtige Erläuterungen.
Ihre große O-Komplexitätszeit ist also nur O(2^|<DeltaTime>|)
deshalb so , weil Sie eine Reihe von Iterationen durchführen, die vom Wert der aktuellen Zeit abhängen. Es macht keinen Sinn, andere numerische Konstanten zu setzen, da die asymptotische Notation nützlich ist, da sie Konstanten eliminiert (so ist beispielsweise die Verwendung von O(10^|<DeltaTime>|*any_time_unit)
sinnlos).
Wo der schwierige Teil ist
Wir haben oben eine wichtige Annahme getroffen: dass das Berechnungsmodell 5- mal reifiziert , und mit Zeit meine ich die (reale?) Physikalische Zeit. Es gibt kein solches Konzept im Standard-Rechenmodell, ein TM kennt die Zeit nicht, wir verknüpfen die Zeit mit der Anzahl der Schritte, weil unsere Realität so funktioniert 4 .
In Ihrem Modell können Sie jedoch die Terminologie funktionaler Personen verwenden, indem Sie sagen, dass Main nicht rein ist, das Konzept jedoch dasselbe.
Um dies zu verstehen, sollte man beachten, dass nichts das Framework daran hindert, eine gefälschte Zeit zu verwenden, die zweimal, fünf, zehnmal schneller als die physische Zeit läuft. Auf diese Weise wird Ihr Code in "der Hälfte", "einem Fünftel", "einem Zehntel" der "Zeit" ausgeführt.
Diese Reflexion ist wichtig für die Auswahl der Codierung von <DeltaTime>
. Dies ist im Wesentlichen eine komprimierte Schreibweise <(CurrentTime, TimeInFuture)>. Da im Priorat keine Zeit vorhanden ist, könnte die Codierung von CurrentTime sehr gut das Wort Now (oder eine andere Wahl) am Vortag sein, das als Yesterday codiert werden könnte , indem die Annahme gebrochen wird, dass die Länge der Codierung zunimmt mit der physischen Zeit geht vorwärts (und der von DeltaTime nimmt ab)
Wir müssen die Zeit in unserem Rechenmodell richtig modellieren, um etwas Nützliches zu tun.
Die einzig sichere Wahl, die wir treffen können, besteht darin, Zeitstempel mit zunehmender Länge zu codieren (aber immer noch nicht unär zu verwenden), wenn die physische Zeit voranschreitet. Dies ist die einzig wahre Eigenschaft der Zeit, die wir brauchen, und diejenige, die die Codierung abfangen muss. Nur mit dieser Art der Codierung kann Ihr Algorithmus eine zeitliche Komplexität erhalten.
Ihre Verwirrung, falls vorhanden, ergibt sich aus der Tatsache, dass das Wort Zeit in den Sätzen "Was ist seine zeitliche Komplexität?" und 'Wie viel Zeit wird es dauern?' bedeutet zu sehr sehr unterschiedlichen Dingen
Leider verwendet die Terminologie dieselben Wörter, aber Sie können versuchen, "Schrittkomplexität" in Ihrem Kopf zu verwenden und sich Ihre Frage erneut zu stellen. Ich hoffe, das hilft Ihnen zu verstehen, dass die Antwort wirklich ^ _ ^ lautet
1 Dies erklärt auch die Notwendigkeit eines asymptotischen Ansatzes, da jede Instanz eine andere, jedoch nicht willkürliche Länge hat.
2 Ich hoffe, ich verwende hier den richtigen englischen Begriff.
3 Auch deshalb finden wir häufig log(log(n))
Begriffe in der Mathematik.
4 Im besten Fall muss ein Schritt ein endliches, aber nicht nulles oder nicht verbundenes Zeitintervall einnehmen.
5 Dies bedeutet, dass der Rechenmodus als Kenntnis der physikalischen Zeit darin, dh mit seinen Begriffen ausgedrückt werden kann. Eine Analogie ist die Funktionsweise von Generika im .NET Framework.
O(N)
keine KomplexitätO(1)