Dies ist mein erster Kurs in Datenstrukturen und jede Vorlesung / TA-Vorlesung, über die wir sprechen O(log(n))
. Dies ist wahrscheinlich eine dumme Frage, aber ich würde mich freuen, wenn mir jemand genau erklären kann, was das bedeutet!
Dies ist mein erster Kurs in Datenstrukturen und jede Vorlesung / TA-Vorlesung, über die wir sprechen O(log(n))
. Dies ist wahrscheinlich eine dumme Frage, aber ich würde mich freuen, wenn mir jemand genau erklären kann, was das bedeutet!
Antworten:
Dies bedeutet, dass das betreffende Objekt (normalerweise die Laufzeit) so skaliert wird, dass es mit dem Logarithmus seiner Eingabegröße übereinstimmt.
Big-O-Notation bedeutet keine exakte Gleichung, sondern eine Grenze . Zum Beispiel ist die Ausgabe der folgenden Funktionen alle O (n):
f(x) = 3x
g(x) = 0.5x
m(x) = x + 5
Denn wie Sie x zu erhöhen, deren Ausgänge alle Anstiege linear - wenn es ein 6 ist: 1 - Verhältnis zwischen f(n)
und g(n)
, es wird auch etwa ein 6: 1 - Verhältnis zwischen f(10*n)
und g(10*n)
und so weiter.
Überlegen Sie, ob O(n)
oder ob O(log n)
es besser ist: wenn n = 1000
, dann log n = 3
(für log-base-10). Welchen Algorithmus soll Ihr Algorithmus lieber ausführen: 1000 Sekunden oder 3 Sekunden?
f(x)
, g(x)
, m(x)
Auch O (n ^ 2). Im Zusammenhang mit der Leistungsanalyse möchten wir jedoch, dass die tightest
Grenze (dh die kleinste Funktion, die die Leistungskurve eines bestimmten Algorithmus begrenzt) uns eine "Worst-Case" -Idee der Leistung eines Algorithmus gibt.
2 ** 4
, während in Bernsteins Code das Beispiel ist 10 ** 3
; Wie bestimme ich Parameter?
Für die kurze Antwort ist O (log n) besser als O (n)
Was genau ist nun O (log n)?
Wenn man sich auf die große O-Notation bezieht, bezieht sich log n im Allgemeinen auf den Logarithmus zur Basis 2 (auf die gleiche Weise repräsentiert ln die Logarithmen der Basis e). Dieser Logarithmus zur Basis 2 ist die Umkehrung einer Exponentialfunktion. Eine Exponentialfunktion wächst sehr schnell und wir können intuitiv ableiten, dass ihre Umkehrung genau das Gegenteil bewirkt, dh sehr langsam wächst .
Zum Beispiel
x = O (log n)
Wir können n darstellen als,
n = 2 x
Und
2 10 = 1024 → lg (1024) = 10
2 20 = 1.048.576 → lg (1048576) = 20
2 30 = 1.073.741.824 → lg (1073741824) = 30
Große Inkremente in n führen nur zu einer sehr geringen Zunahme von log (n)
Für eine Komplexität von O (n) erhalten wir andererseits eine lineare Beziehung
Ein Faktor von log 2 n sollte jederzeit übernommen werden. Ein Faktor von n.
Um dies weiter zu festigen, stieß ich auf ein Beispiel in Algorithmen, die von Thomas Cormen freigeschaltet wurden
Betrachten Sie 2 Computer: A und B.
Beide Computer haben die Aufgabe, ein Array nach einem Wert zu durchsuchen. Nehmen wir an, die Arrays enthalten 10 Millionen zu durchsuchende Elemente
Computer A - Dieser Computer kann 1 Milliarde Anweisungen pro Sekunde ausführen und soll die obige Aufgabe unter Verwendung eines Algorithmus mit einer Komplexität von O (n) ausführen. Wir können die Zeit schätzen, die dieser Computer benötigt, um die Aufgabe als zu erledigen
n / (Anweisungen p Sekunde) → 10 7/10 ^ 9 = 0,01 Sekunden
Computer B - Dieser Computer ist viel langsamer und kann nur 10 Millionen Anweisungen pro Sekunde ausführen. Von Computer B wird erwartet, dass er die obige Aufgabe unter Verwendung eines Algorithmus mit einer Komplexität von O (log n) ausführt. Wir können die Zeit schätzen, die dieser Computer benötigt, um die Aufgabe als zu erledigen
log (n) / (Anweisungen p Sekunde) → log (10 7 ) / 10 7 = 0,000002325349
Mit dieser Abbildung können wir sehen, dass Computer A, obwohl er aufgrund des von B verwendeten Algorithmus viel besser als Computer B ist, die Aufgabe viel schneller erledigt.
Ich denke, es sollte jetzt sehr klar sein, warum O (log (n)) viel schneller ist als O (n)
Für die Eingabe der Größe n
führt ein Algorithmus von O(n)
Schritte proportional zu aus n
, während ein anderer Algorithmus von O(log(n))
Schritte ungefähr ausführt log(n)
.
Ist eindeutig log(n)
kleiner als n
daher ist der Algorithmus der Komplexität O(log(n))
besser. Da wird es viel schneller gehen.
http://en.wikipedia.org/wiki/Big_oh
O (log n) ist besser.
O (logn) bedeutet, dass die maximale Laufzeit des Algorithmus proportional zum Logarithmus der Eingabegröße ist. O (n) bedeutet, dass die maximale Laufzeit des Algorithmus proportional zur Eingabegröße ist.
Im Grunde ist O (etwas) eine Obergrenze für die Anzahl der Anweisungen des Algorithmus (atomare). Daher ist O (logn) enger als O (n) und auch in Bezug auf die Algorithmusanalyse besser. Aber alle Algorithmen, die O (logn) sind, sind auch O (n), aber nicht rückwärts ...
Formale Definition:
g (x) = O (f (x)) <=> es gibt x0 und die Konstante C, die für jedes x> x0 | g (x) | gilt <= C | f (x) |.
Wenn Sie also den Algorithmus A für das Problem P finden, dessen Komplexität O (f (n)) ist, können Sie sagen, dass die Anzahl der Schritte, die Ihr Algorithmus ausführt, asymptotisch niedriger oder gleich f (n) ist, wenn n normalerweise die ist Eingabegröße. (n kann alles sein)
Zur weiteren Lektüre: http: //en.wikipedia.org/wiki/Big_O_notation.