Big O formal
O ( f( n ) ) = { g( n ) | ∃ c > 0 , ∃n0> 0 , ∀ n >n0: 0 ≤ g( n ) ≤ c ∗ f( n ) }
Big O Informell
O ( f( n ) ) ist der Satz von Funktionen, die langsamer (oder gleich schnell) wachsen als f(n). Dies bedeutet, dass jede Funktion, aus der Sie auswählenO(f(n))Nennen wir sie g(n), und Sie wählen eine ausreichend große n, f(n) wird größer sein alsg(n). Oder mit anderen Worten:f(n) wird irgendwann jede Funktion in übertreffen O(f(n)) wann n wird größer. n ist die Eingabegröße Ihres Algorithmus.
Als Beispiel. Lass uns auswählenf(n)=n2.
Wir können das sagen f(n)∈O(n3). Beachten Sie, dass wir im Laufe der Zeit den Missbrauch von Notationen zugelassen haben, sodass fast jeder schreibtf(n)=O(n3) jetzt.
Normalerweise betrachten wir bei der Bewertung von Algorithmen deren Reihenfolge. Auf diese Weise können wir vorhersagen, wie sich die Laufzeit des Algorithmus erhöht, wenn die Eingabegröße (n) erhöht sich.
In Ihrem Beispiel sind beide Algorithmen in Ordnung O(n2). Ihre Laufzeit erhöht sich also auf die gleiche Weise (quadratisch) wienerhöht sich. Ihr zweiter Algorithmus ist viermal langsamer als der erste, aber das interessiert uns normalerweise nicht ** theoretisch *. Algorithmen mit derselben Reihenfolge können unterschiedliche Faktoren haben (cin der formalen Definition) oder andere Begriffe niedrigerer Ordnung in der Funktion, die die Anzahl der Schritte bewertet. Aber normalerweise liegt das an den Implementierungsdetails, und das interessiert uns nicht.
Wenn Sie einen Algorithmus haben, der ausgeführt wird O(log(n)) Zeit können wir sicher sagen, dass es schneller sein wird als O(n) [1] weil log(n)=O(n). Egal wie schlimm das istO(log(n)) Der Algorithmus ist implementiert, egal wie viel Overhead Sie in den Algorithmus stecken, er ist immer [1] schneller als der O(n)Algorithmus. Auch wenn die Anzahl der Schritte in den Algorithmen ist9999∗log(n)=O(log(n)) und 0.0001∗n=O(n), das O(log(n)) Algorithmus wird schließlich schneller sein [1].
Aber vielleicht in Ihrer Bewerbung, n ist immer niedrig und wird nie groß genug sein, so dass die O(log(n))Algorithmus wird in der Praxis schneller sein . Also mit demO(n) Der Algorithmus führt trotz allem zu schnelleren Laufzeiten n=O(log(n))
[1] wenn n ist ausreichend groß.
n
klein sind, undn
normalerweise klein. Ausgefallene Algorithmen haben große Konstanten. Bis Sie wissen, dass diesn
häufig groß sein wird, ziehen Sie an Ich werde nicht schick. " Dies liegt an dem Unterschied zwischen theoretischer Komplexität und praktischer Effizienz, der in den folgenden Antworten genau definiert ist.