Big O: Obergrenze
"Big O" ( ) ist bei weitem das häufigste. Wenn Sie die Komplexität eines Algorithmus analysieren, müssen Sie in den meisten Fällen eine Obergrenze dafür festlegen, wie schnell die Laufzeit¹ ansteigt, wenn die Größe der Eingabe zunimmt. Grundsätzlich möchten wir wissen, dass das Ausführen des Algorithmus nicht zu lange dauern wird. Wir können dies nicht in tatsächlichen Zeiteinheiten (Sekunden) ausdrücken, da dies von der genauen Implementierung abhängen würde (wie das Programm geschrieben ist, wie gut der Compiler ist, wie schnell der Prozessor der Maschine ist, ...). Wir bewerten also, was nicht von solchen Details abhängt, dh wie lange es dauert, den Algorithmus auszuführen, wenn wir größere Eingaben vornehmen. Und es ist uns vor allem wichtig, wenn wir sicher sein können, dass das Programm fertig ist, und wir normalerweise wissen möchten, dass es so oder so viel Zeit oder weniger in Anspruch nimmt.O
Zu sagen, dass ein Algorithmus eine Laufzeit von für eine Eingabegröße n hat, bedeutet, dass eine Konstante K existiert, so dass der Algorithmus in höchstens K abgeschlossen istO(f(n))nK Schritte, dh die Laufzeit des Algorithmus wächst höchstens so schnell wie f (bis zu einem Skalierungsfaktor). Die Angabe von T ( n ) als Laufzeit des Algorithmus für die Eingangsgröße n , O ( n ) bedeutet informell, dass T ( n ) ≤ f ( n ) bis zu einem gewissen Skalierungsfaktor ist.Kf(n)fT(n)nO(n)T(n)≤f(n)
Untergrenze
Manchmal ist es nützlich, mehr Informationen als eine Obergrenze zu haben. ist die Umkehrung von O : Sie drückt aus, dass eine Funktion mindestens so schnell wächst wie eine andere. T ( n ) = Ω ( g ( n )ΩOT(n)=Ω(g(n))T(N)≥K′g(n)K′T(n)≥g(n)
ΘOΩT(n)=Θ(h(n))Kh(n)≥T(n)≥K′h(n)KK′T(n)≈h(n)
Weitere Überlegungen
oωoOOoω
Ich war in der obigen Diskussion etwas informell. Wikipedia hat formelle Definitionen und einen mathematischeren Ansatz.
T(n)=O(f(n))O(f(n))nT∈O(f)
Beispiel: Einige Sortieralgorithmen
nO(n2)O(n2)kn−kn(n−1)/2n(n−1)/2n2Θ(n2)
O(n2)O(nlg(n))nlg(n)Θ(nlg(n))
O(n2)Θ(n2)Ω(n)Θ(nlg(n))
x≤yx>yΩ(n)nn−1Ω(nlg(n))KnKnlg(n)n!n!Θ(lg(n!))=Θ(nlg(n))Ω(nlg(n))
¹ Oder anderer Ressourcenverbrauch wie Speicherplatz. In dieser Antwort berücksichtige ich nur die Laufzeit.