Für Datenstrukturen vom Typ eines binären Suchbaums wird die Big O-Notation normalerweise als O (logn) angegeben. Bedeutet dies mit einem Kleinbuchstaben 'l' im Protokoll die Protokollbasis e (n), wie sie durch den natürlichen Logarithmus beschrieben wird? Entschuldigung für die einfache Frage, aber ich hatte immer Probleme, zwischen den verschiedenen impliziten Logarithmen zu unterscheiden.
math
binary-tree
complexity-theory
big-o
BuckFilledPlatypus
quelle
quelle
log n
, meint er den natürlichen Logarithmus. 2. Wenn ein Informatiker schreibtlog n
, meint er Basis zwei. 3. Wenn ein Ingenieur schreibtlog n
, meint er Basis zehn. Diese sind normalerweise wahr.Antworten:
Einmal in der Notation big-O () ausgedrückt, sind beide korrekt. Während der Ableitung des O () - Polynoms ist im Fall der binären Suche jedoch nur log 2 korrekt. Ich gehe davon aus, dass diese Unterscheidung die intuitive Inspiration für Ihre Frage war.
Meiner Meinung nach ist das Schreiben von O (log 2 N) für Ihr Beispiel besser, da es die Ableitung der Laufzeit des Algorithmus besser kommuniziert.
In der Big-O () - Notation werden konstante Faktoren entfernt. Bei der Umrechnung von einer Logarithmusbasis in eine andere wird mit einem konstanten Faktor multipliziert.
O (log N) entspricht also aufgrund eines konstanten Faktors O (log 2 N).
Wenn Sie jedoch in Ihrer Antwort leicht log 2 N setzen können, ist dies pädagogischer. Bei der Suche nach binären Bäumen haben Sie Recht, dass log 2 N während der Ableitung der Laufzeit von big-O () eingeführt wird.
Bevor Sie das Ergebnis als big-O () -Notation ausdrücken, ist der Unterschied sehr wichtig. Wenn das zu kommunizierende Polynom über die Big-O-Notation abgeleitet wird, ist es für dieses Beispiel falsch , vor dem Anwenden der O () - Notation einen anderen Logarithmus als log 2 N zu verwenden. Sobald das Polynom verwendet wird, um eine Worst-Case-Laufzeit über die Big-O () -Notation zu kommunizieren, spielt es keine Rolle, welcher Logarithmus verwendet wird.
quelle
log_2 n
es sichΘ(log_a n)
um eine Basis handelta
, daher bin ich mir nicht sicher, ob die Verwendung von Basis 2 "korrekter" ist.O - Notation nicht durch logarithmische Basis beeinträchtigt wird, weil alle Logarithmen in verschiedenen Basen sind mit einem konstanten Faktor bezogen ,
O(ln n)
entsprichtO(log n)
.quelle
log_2 x
unterscheidet sichlog_b x
von einem konstanten Faktorc(b)
für jede Basisb
unabhängig vonx
.log_2 n
, kann ich einfachlog_2 n
überall hineingehen und ersetzenlog_pi 2 * log_2 n / log_pi 2
und dann einfach eine Analyse erhalten, dielog_pi 2 * log_pi n
überall vorhanden ist. Jetzt ist meine Analyse in Bezug auflog_pi n
.Es spielt keine Rolle, um welche Basis es sich handelt, da die Big-O-Notation normalerweise nur mit der asymptotisch höchsten Ordnung von geschrieben wird
n
, sodass konstante Koeffizienten wegfallen. Da eine andere Logarithmusbasis einem konstanten Koeffizienten entspricht, ist sie überflüssig.Das heißt, ich würde wahrscheinlich Log Base 2 annehmen.
quelle
Beide sind richtig. Denk darüber nach
quelle
Ja, wenn es um Big-O-Notation geht, spielt die Basis keine Rolle. Bei einem echten Suchproblem ist dies jedoch rechnerisch von Bedeutung.
Wenn Sie eine Intuition über Baumstrukturen entwickeln, ist es hilfreich zu verstehen, dass ein binärer Suchbaum in O (n log n) Zeit durchsucht werden kann, da dies die Höhe des Baums ist, dh in einem binären Baum mit n Knoten der Baum Tiefe ist O (n log n) (Basis 2). Wenn jeder Knoten drei untergeordnete Knoten hat, kann der Baum weiterhin in O (n log n) -Zeit durchsucht werden, jedoch mit einem Logarithmus zur Basis 3. Rechnerisch kann die Anzahl der Kinder, die jeder Knoten hat, einen großen Einfluss auf die Leistung haben (siehe zum Beispiel: Linktext ).
Genießen!
Paul
quelle
Technisch spielt die Basis keine Rolle, aber Sie können sie allgemein als Basis 2 betrachten.
quelle
Zuerst müssen Sie verstehen, was es bedeutet, dass eine Funktion f (n) O (g (n)) ist.
Die formale Definition lautet: * Eine Funktion f (n) heißt O (g (n)) iff | f (n) | <= C * | g (n) | wann immer n> k, wobei C und k Konstanten sind. *
also sei f (n) = logarithmische Basis a von n, wobei a> 1 und g (n) = logarithmische Basis b von n, wobei b> 1 ist
HINWEIS: Dies bedeutet, dass die Werte a und b beliebig größer als 1 sein können, z. B. a = 100 und b = 3
Jetzt erhalten wir Folgendes: log base a von n heißt O (log base b von n) iff | log base a von n | <= C * | log base b von n | wann immer n> k
Wählen Sie k = 0 und C = log base a von b.
Nun sieht unsere Gleichung wie folgt aus: | log base a von n | <= log base a von b * | log base b von n | wann immer n> 0
Beachten Sie die rechte Seite, wir können die Gleichung manipulieren: = log base a von b * | log base b von n | = | log base b von n | * log base a von b = | log base a von b ^ (log base b von n) | = | log base a von n |
Nun sieht unsere Gleichung wie folgt aus: | log base a von n | <= | log base a von n | wann immer n> 0
Die Gleichung ist immer wahr, unabhängig von den Werten n, b oder a, abgesehen von ihren Einschränkungen a, b> 1 und n> 0. Die logarithmische Basis a von n ist also O (logarithmische Basis b von n), und da a, b keine Rolle spielen, können wir sie einfach weglassen.
Sie können ein YouTube-Video hier sehen: https://www.youtube.com/watch?v=MY-VCrQCaVw
Sie können einen Artikel dazu hier lesen: https://medium.com/@randerson112358/omitting-bases-in-logs-in-big-o-a619a46740ca
quelle