Ich bin Programmierer und habe gerade angefangen, Algorithmen zu lesen. Ich bin nicht ganz überzeugt von den Bezeichnungen Bog Oh, Big Omega und Big Theta. Der Grund ist laut Definition von Big Oh, dass es eine Funktion g (x) geben sollte, die immer größer oder gleich f (x) ist. Oder f (x) <= cn für alle Werte von n> n0.
Warum erwähnen wir den konstanten Wert in der Definition nicht? Nehmen wir zum Beispiel eine Funktion 6n + 4 an, die wir als O (n) bezeichnen. Aber es ist nicht wahr, dass die Definition für alle konstanten Werte gilt. Dies gilt nur, wenn c> = 10 und n> = 1. Für kleinere Werte von c als 6 erhöht sich der Wert von n0. Warum erwähnen wir den konstanten Wert nicht als Teil der Definition?
big-o
algorithm-analysis
Pradeep
quelle
quelle
Antworten:
O (n) und andere Ordnungsnotationen beschäftigen sich (normalerweise) nicht mit dem Verhalten von Funktionen für kleine Werte. Es geht um das Verhalten von Funktionen für sehr große Werte, nämlich Grenzen, wenn n gegen unendlich geht.
Die Konstanten sind technisch gesehen von Bedeutung, werden jedoch in der Regel abstrahiert, sobald n groß genug ist, ist der Wert von c völlig irrelevant. Wenn der Wert von c wichtig ist, können wir ihn in die Analyse einbeziehen. Wenn jedoch die zu vergleichenden Funktionen sehr große konstante Faktoren aufweisen oder wenn die Effizienz ein besonders wichtiges Anliegen ist, ist dies normalerweise nicht der Fall.
quelle
Es gibt mehrere Gründe, aber der wahrscheinlich wichtigste ist, dass Konstanten eine Funktion der Implementierung des Algorithmus sind, nicht des Algorithmus selbst. Die Reihenfolge eines Algorithmus ist nützlich, um Algorithmen unabhängig von ihrer Implementierung zu vergleichen.
Die tatsächliche Laufzeit einer Quicksortierung ändert sich normalerweise, wenn sie in C oder Python oder Scala oder Postscript implementiert ist. Gleiches gilt für die Bubble-Sortierung - die Laufzeit variiert je nach Implementierung erheblich.
Was sich jedoch nicht ändert, ist die Tatsache, dass sich die für die Ausführung einer Blasensortierung erforderliche Zeit schneller erhöht, wenn der Datensatz größer wird, wenn alle anderen Werte gleich sind, und zwar unabhängig von Sprache oder Computer Sie werden unter der Annahme einer einigermaßen korrekten Implementierung mit implementiert. Diese einfache Tatsache ermöglicht es Ihnen, intelligente Rückschlüsse auf die Algorithmen selbst zu ziehen, wenn keine konkreten Details verfügbar sind.
Die Reihenfolge eines Algorithmus filtert Faktoren heraus, die zwar für Messungen in der realen Welt wichtig sind, beim Vergleich abstrakter Algorithmen jedoch nur zu Rauschen neigen.
quelle
Die Big-O-Notation nach Definition besagt Folgendes : Die Big-O-Notation basiert auf der Intuition, dass für alle Werte n an und rechts von n 'der Wert von f (n) auf oder unter cg (n) liegt. Die Konstanten spielen auch keine Rolle, wenn Sie zu höherwertigen (variablen) Faktoren (wie n-Quadrat oder n-Würfel) wechseln, da sie nur die Konstanten und nicht die variierenden Größen sind, die so groß werden können wie diese Faktoren. Unten ist das Diagramm der Big-O-Notation angegeben.
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}
Das Wesentliche dieser Notation liegt in der Tatsache "
how lower is f(n) from c.g(n) and not when it starts becoming lower
".quelle
In der Algorithmusanalyse ist die Reihenfolge des Wachstums die Schlüsselabstraktion und gibt die Rate an, mit der sich die Laufzeit ändert, wenn sich die Eingabegröße ändert. Angenommen, ein Algorithmus hat eine Laufzeit
f(n) = 2n + 3
. Jetzt schließen wir eine Eingabegröße an,Wie zu sehen ist, wird die Wachstumsordnung hauptsächlich durch die Variable bestimmt
n
; Die Konstanten 2 und 3 sind weniger wichtig, und wenn die Eingabegröße zunimmt, werden sie bei der Bestimmung noch weniger wichtig. Aus diesem Grund werden in der Algorithmusanalyse Konstanten zugunsten der Variablen abgeklungen, die die Wachstumsordnung einer Funktion bestimmen.quelle
(Da dies eine längere Antwort ist, lesen Sie die Fettschrift für eine Zusammenfassung. )
Lassen Sie uns Ihr Beispiel nehmen und Schritt für Schritt durchgehen, um den Zweck zu verstehen, der hinter dem steht, was wir tun. Wir beginnen mit Ihrer Funktion und dem Ziel, die Big Oh-Notation zu finden:
Erstens lassen
O(g(n))
die Big Oh Notation wir zu finden versuchenf(n)
. Nach der Definition von Big Oh müssen wir eine vereinfachteg(n)
Form finden, bei der es einige Konstanten gibtc
undn0
bei derc*g(n) >= f(n)
gilt, dass allen
größer sind alsn0
.Lassen Sie uns zuerst wählen
g(n) = 6n + 4
(wasO(6n+4)
in Big Oh ergeben würde ). In diesem Fall sehen wir, dassc = 1
und jeder Wert vonn0
die mathematischen Anforderungen aus unserer Definition von Big Oh erfüllt, dag(n)
immer gleich istf(n)
:Zu diesem Zeitpunkt haben wir die mathematischen Anforderungen erfüllt. Wenn wir bei stehen bleiben
O(6n+4)
, ist es klar, dass dies nicht hilfreicher ist als das Schreibenf(n)
. Es würde also den wahren Zweck der Big Oh-Notation verfehlen: die allgemeine zeitliche Komplexität eines Algorithmus zu verstehen! Fahren wir also mit dem nächsten Schritt fort: der Vereinfachung.Erstens, können wir das
6n
so vereinfachen, dass das große Oh istO(4)
? Nein! (Übung für den Leser, wenn er nicht versteht warum)Zweitens können wir das vereinfachen,
4
so dass das große Oh istO(6n)
? Ja! In diesem Fallg(n) = 6n
also:An dieser Stelle wählen wir, dass
c = 2
die linke Seite für jedes Inkrement von um 12 schneller (um 12) als die rechte Seite (um 6) ansteigtn
.Jetzt müssen wir ein Positiv finden,
n0
bei dem die obige Gleichung für alle giltn
, die größer als dieser Wert sind. Da wir bereits wissen, dass die linke Seite schneller wächst als die rechte, müssen wir nur eine positive Lösung finden. Da somitn0 = 2
die oben wahr macht, wissen wir , dassg(n)=6n
, oderO(6n)
ist eine potentielle Big Oh Notationf(n)
.Können wir das vereinfachen,
6
damit das große Oh istO(n)
? Ja! In diesem Fallg(n) = n
also:Wählen wir,
c = 7
da die linke schneller zunimmt als die rechte.Wir sehen, dass das oben Gesagte für alle gilt
n
, die größer oder gleich sindn0 = 4
. SomitO(n)
ist eine potenzielle Big Oh-Notation fürf(n)
. Können wir noch vereinfacheng(n)
? Nee!Schließlich haben wir festgestellt, dass die einfachste Big Oh-Notation für
f(n)
istO(n)
. Warum haben wir das alles durchgemacht? Weil wir jetzt wissen, dass diesf(n)
linear ist , da die Big Oh-Notation von linearer Komplexität istO(n)
. Das Schöne ist, dass wir jetzt die zeitliche Komplexitätf(n)
mit anderen Algorithmen vergleichen können! Zum Beispiel wissen wir jetzt , dassf(n)
in vergleichbarer Zeit Komplexität der Funktionen isth(n) = 123n + 72
,i(n) = n
,j(n) = .0002n + 1234
, etc; da sie denselben oben beschriebenen Vereinfachungsprozess verwenden, haben sie alle eine lineare Zeitkomplexität vonO(n)
.Süss!!!
quelle
O(4)
, unsere Ungleichung aufzulösenc*4 >= 6n+4
, könntenc
wir für jeden, den wir ausgewählt haben, immer einen Wert finden, bei dem alle Werten
darüber die Ungleichung falsch machen würden.c
undn0
nicht wichtig. Was wichtig ist, ist, dassn0
es für die, diec
wir auswählen , existiert . Damit dies wahr ist, muss die linke Seite der Ungleichung für große Werte von schneller zunehmen als die rechte Seiten
.c=6
ist nicht gut dafür (6n >= 6n+4
ist nie wahr), also habe ich gewähltc=7
. Ich hätte genauso leicht heraussuchenc=10
könnenc=734
, oder ichc=6.0000001
hätte immer noch sehen können, dass es einige gibtn0
, die die Ungleichung wahr machenn >= n0
, was bedeutet, dass das große Oh, das wir testen, gültig ist.Wenn Sie eine Leistungsfunktion von haben
6n + 4
, lautet die relevante Frage "6 was?". Als ein Kommentar gefragt: Was repräsentiert deine Konstante? Was sind physikalisch gesehen die Einheiten Ihres konstanten Faktors?Der Grund, warum die O () - Notation so häufig zur Beschreibung der Algorithmusleistung verwendet wird, ist, dass es keine tragbare Möglichkeit gibt, diese Frage zu beantworten. Verschiedene Prozessoren benötigen eine unterschiedliche Anzahl von Taktzyklen und eine unterschiedliche Zeitdauer, um dieselbe Elementarberechnung durchzuführen, oder sie können die relevanten Elementarberechnungen unterschiedlich zusammenfassen. Unterschiedliche Computersprachen oder unterschiedliche formale und informelle Beschreibungen wie Pseudocode stellen Algorithmen auf eine Weise dar, die nur schwer direkt zu vergleichen ist. Sogar Implementierungen in derselben Sprache können denselben Algorithmus auf unterschiedliche Weise darstellen - triviale Formatierungsdetails wie die Anzahl der Zeilen stehen im Allgemeinen zur Verfügung, um einen beliebigen Algorithmus zu implementieren.
Anders ausgedrückt: Wir verwenden "Algorithmus" nicht, um eine bestimmte Implementierung zu beschreiben, sondern um eine ganze Klasse potenzieller Implementierungen derselben allgemeinen Prozedur zu beschreiben. Diese Abstraktion ignoriert die Details der Implementierung, um etwas von allgemeinem Wert zu dokumentieren, und der konstante Leistungsfaktor ist eines dieser Details.
Allerdings werden Algorithmusbeschreibungen häufig von Folklore, Notizen oder sogar tatsächlichen Benchmarks begleitet, die die Leistung tatsächlicher Implementierungen auf tatsächlicher Hardware beschreiben. Dies gibt Ihnen eine ungefähre Vorstellung davon, welche Art von konstantem Faktor zu erwarten ist. Sie sollten ihn jedoch auch mit einem Körnchen Salz einnehmen, da die tatsächliche Leistung davon abhängt, wie viel Arbeit in die Optimierung einer bestimmten Implementierung gesteckt wurde. Langfristig tendiert die relative Leistung vergleichbarer Algorithmen dazu, sich zu ändern, wenn sich die Architektur der neuesten und größten Prozessoren ändert ...
quelle
Der gesamte Begriff der Big-Oh-Notation besteht darin, Konstanten zu ignorieren und den wichtigsten Teil der Funktion darzustellen, die die Laufzeit eines Algorithmus beschreibt.
Vergiss die formale Definition für einen Moment. Welches ist die schlechtere (schneller wachsende) Funktion
n^2 - 5000
oder5000 n + 60000
? Fürn
weniger als 5000 ist die lineare Funktion größer (und damit schlechter). Darüber hinaus (genauer Wert 5013?) Ist die quadratische Gleichung größer.Da es mehr (ziemlich viele mehr) positive Zahlen gibt, die größer als 5000 sind, nehmen wir das Quadrat als die "größere" (schlechtere) Funktion im Allgemeinen. Die Ordnungsnotation (Big-Oh usw.) erzwingt dies (Sie können mit diesen Definitionen immer einen Zusatz und eine multiplikative Konstante eliminieren).
Natürlich sind die Dinge nicht immer einfach. Manchmal muss man tun will , dass diese Konstanten kennen. Was ist besser Einfügung sortieren oder Bubble sortieren? Beides sind
O(n^2)
. Aber einer ist wirklich besser als der andere. Mit einer ausführlicheren Analyse können Sie Konstanten erhalten, über die Sie sich wundern. Normalerweise ist es viel einfacher, die Big-Oh-Funktion zu berechnen, als eine genauere Funktion.Big-Oh ignoriert diese Konstanten, um die wichtigsten Vergleiche zu vereinfachen und zu vereinfachen. Wir mögen die Notation, weil wir normalerweise nichts über die (meist irrelevanten) Konstanten wissen wollen.
quelle