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 tightestGrenze (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 nfü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 ndaher 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.