Gibt es Variationen der regulären Laufzeiten der Big-O-Notation?


9

Es gibt mehrere O Notationen wie oder und so weiter. Ich habe mich gefragt, ob es in der Realität Variationen wie oder gibt oder ob diese mathematisch falsch sind.O(n)O(n2)O(2n2)O(logn2)

Oder wäre es richtig zu sagen, dass es möglich ist, ein zu einem zu verbessern ? Ich kann und muss noch keine Laufzeiten herausfinden und ich muss nichts verbessern, aber ich muss wissen, ob Sie so Ihre Funktionen in der Realität beschreiben.O(5n2)O(3n2)


1
Während einer asymptotischen Analyse gibt es keinen wesentlichen Unterschied zwischen O (5n ^ 2) und O (3n ^ 2). Sie sind beide O (n ^ 2) und unterscheiden sich nur durch eine Konstante. In einem Beweis könnten Sie sogar O (5n ^ 2) auf O (3n ^ 2) oder O (n ^ 2) reduzieren, um die Mathematik sauberer zu machen, da sie äquivalent sind. Wenn Sie Ihren Beweis schreiben, notieren Sie in einer Seitenleiste, dass sie gleichwertig sind. Sie können sogar ein O (log n) gegen O (n) tauschen und feststellen, dass O (log n) <= O (n) in der Seitenleiste ist. Der Hinweis in der Seitenleiste weist den Leser darauf hin, dass dies beabsichtigt und kein Tippfehler ist. (Zumindest habe ich das so gemacht, als ich im College Algorithm Analysis gemacht habe).
JWW

2
Wenn Sie die Notation verwenden, um kleine Faktoren zu beseitigen, können Sie immer etwas schreiben wie "... verbessert die Laufzeit von auf "usw. Oder äquivalent und . Einige Autoren bevorzugen es, als Abkürzung für die erstere zu schreiben . Siehe zum Beispiel das Lehrbuch von Trefethen und Bau. 5 n 2 + o ( n 2 ) 3 n 2 + o ( n 2 ) ( 5 + o ( 1 ) ) n 2 ( 3 + o ( 1 ) ) n 25 n 2O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n25n2
Yonatan N

Antworten:


21

Ich habe mich gefragt, ob es in der Realität Abweichungen von solchen wie O(2n2) oder O(log(n2)) gibt oder ob diese mathematisch falsch sind.

Ja, O(2n2) oder O(log(n2)) sind gültige Variationen.

Sie werden sie jedoch selten sehen, wenn Sie sie überhaupt sehen würden, insbesondere in den Endergebnissen. Der Grund dafür ist , dass O(2n2) ist , O(n2) . Ähnlich O(log(n2)) ist O(logn) . Für Anfänger mag das überraschend sein. Diese Gleichheiten sind jedoch mehr oder weniger der Grund, warum große O Notationen eingeführt wurden, um einen multiplikativen konstanten Faktor zu verbergen, der oft schwer zu bestimmen und relativ unbedeutend ist.

Wäre es richtig zu sagen, dass es möglich ist, ein O(5n2) zu einem O(3n2) zu verbessern ?

Es ist überhaupt keine Verbesserung, wenn die zeitliche Komplexität eines Algorithmus von O(5n2) auf O(3n2) oder von Ω(5n2) auf Ω(3n2) geändert wird , weil O(5n2) ist , O(3n2) während Ω(5n2) ist , Ω(3n2) . Es ist also falsch zu sagen, dass die Zeitkomplexität vonO(5n2) aufO(3n2) verbessert wird. Es ist richtig zu sagen, dass die zeitliche Komplexität eines Algorithmusnatürlichvon5n2 auf3n2 verbessert wird.


Aufgabe 1. Zeigen Sie, dass O(5n2)=O(3n2)=O(n2) .

Aufgabe 2. Zeigen Sie, dass O(logn)=O(log(n2)) .

Aufgabe 3. Zeigen Sie, dass Ω(n2+n)=Ω(n2) .


1
@bv_Martn Hier ist ein guter Link, um zu verstehen, wie die Notation definiert ist (nur einfache Grenzwertrechnung!): math.stackexchange.com/questions/925053/…Ö(n)
Akshat Mahajan

2
Das einzige Mal, dass ich konstante Faktoren in der Big-O-Notation gesehen habe, ist, wenn jemand darauf hinweisen möchte, dass zwei Algorithmen zwar dieselbe Komplexitätsklasse haben, einer jedoch strikt schneller als der andere ist.
Markieren Sie

7
@AkshatMahajan Die einzige Antwort auf diese Frage /math/925053 ist eindeutig falsch. Es gibt viele zuverlässige Quellen für große Notationen. O
John L.

1
"Es ist richtig zu sagen, dass die zeitliche Komplexität eines Algorithmus von 5n ^ 2 auf 3n ^ 2 verbessert wird" - obwohl die genaue Laufzeit häufig für verschiedene Eingabegrößen und -werte variiert. Dies beinhaltet auch das Gewichten aller Operationen / das Fokussieren auf eine Operation, was möglicherweise nicht viel über die konstanten Faktoren aussagt, die Sie in der realen Welt erhalten, oder mit anderen Algorithmen vergleichbar ist, die unterschiedliche Gewichte verwenden. Obwohl es einige gültige Anwendungsfälle gibt, ist es von begrenztem Nutzen, etwas wie das oben Gesagte zu sagen (was wahrscheinlich der Grund ist, warum es selten gesehen wird).
Dukeling

1
@ Mark: Das ist einfach falsch.
user21820

13

Es steht Ihnen jederzeit frei, diese Notation überhaupt nicht zu verwenden. Das heißt, Sie können eine Funktion f(n) so genau wie möglich bestimmen und dann versuchen, diese zu verbessern. Beispielsweise könnten Sie einen Sortieralgorithmus haben, der f(n) -Vergleiche durchführt, sodass Sie versuchen könnten, einen anderen Sortieralgorithmus zu finden, der nur g(n) -Vergleiche durchführt. Natürlich existieren alle Arten von Funktionen f(n) (theoretisch) und können auch (in der Praxis) auftreten.

Anstatt die Big Oh-Notation als mysteriöse Magie zu behandeln, bei der Sie Zauberer konsultieren müssen, um zu fragen, ob Sie etwas tun können, sollten Sie sich ihre Definition ansehen . Respektieren Sie die Definition und tun Sie dann alles, was Sie brauchen, um Ihre Arbeit zu erledigen.


Nun, ich brauche es noch nicht in der Praxis. Oder theoretisch muss ich nur wissen, ob die in Wikipedia angegebenen Definitionen O (1) -O (n!) Die einzigen sind, die existieren, oder ob Sie sie in Wirklichkeit anders beschreiben könnten, wenn sie unterschiedlich sind, wie z. B. O. (7N). Ich befürchte, wenn ich das benutze,
verliert

1
Jede Definition, die jemand macht, existiert. Sie sollten sehr sorgfältig lesen, was die Notation oder O ( n ! ) Bedeutet, da Ihre Frage keinen Sinn ergibt. Es gibt keine Verknüpfungen. Wenn Sie verstehen möchten, was ein mathematischer Inhalt bedeutet, müssen Sie bereit sein, etwas Zeit zu investieren. O(1)O(n!)
Juho

6
@bv_Martn Es ist viel wahrscheinlicher, dass der Mathematikprofessor ausfällt, weil Sie eine Liste von Beispielen als Liste von Definitionen anzeigen . In der Mathematik geht es vor allem darum, Dinge so zu definieren, dass sie allgemein funktionieren, nicht nur in bestimmten Fällen. Ihre Frage ist im Grunde eine fortgeschrittenere Version von "Wikipedia sagt, dass ich eine und zwei und siebzehn hinzufügen kann. Aber kann ich auch andere Zahlen hinzufügen?"
David Richerby

7

Die akzeptierte Antwort ist zwar recht gut, berührt aber immer noch nicht den wahren Grund, warum O(n)=O(2n) .

Die Big-O-Notation beschreibt die Skalierbarkeit

Im Kern beschreibt die Big-O-Notation nicht, wie lange die Ausführung eines Algorithmus dauert. Es ist auch keine Beschreibung, wie viele Schritte, Codezeilen oder Vergleiche ein Algorithmus durchführt. Dies ist am nützlichsten, wenn beschrieben wird, wie ein Algorithmus mit der Anzahl der Eingaben skaliert.

Nehmen Sie zum Beispiel eine binäre Suche. Wie finden Sie bei einer sortierten Liste einen beliebigen Wert darin? Nun, Sie könnten in der Mitte beginnen. Da die Liste sortiert ist, gibt der mittlere Wert an, in welcher Hälfte der Liste sich Ihr Zielwert befindet. Die Liste, die Sie durchsuchen müssen, wird nun in zwei Hälften geteilt. Dies kann rekursiv angewendet werden und dann in die Mitte der neuen Liste usw. verschoben werden, bis die Listengröße 1 beträgt und Sie Ihren Wert gefunden haben (oder er in der Liste nicht vorhanden ist). Durch Verdoppeln der Größe der Liste wird dem Algorithmus nur ein zusätzlicher Schritt hinzugefügt, bei dem es sich um eine logarithmische Beziehung handelt. Somit ist dieser Algorithmus O(logn). Der Logarithmus ist Basis 2, aber das spielt keine Rolle - der Kern der Beziehung besteht darin, dass das Multiplizieren der Liste mit einem konstanten Wert der Zeit nur einen konstanten Wert hinzufügt.

Vergleichen Sie eine Standardsuche mit einer unsortierten Liste. In diesem Fall können Sie nur nach einem Wert suchen, indem Sie jeden einzelnen überprüfen. Das schlimmste Szenario (was Big-O speziell impliziert) ist, dass Ihr Wert ganz am Ende steht, was bedeutet, dass Sie für eine Liste der Größe nn Werte überprüfen müssen . Durch Verdoppeln der Größe der Liste wird die Anzahl der Überprüfungen verdoppelt. Dies ist eine lineare Beziehung. O(n) . Aber selbst wenn Sie zwei Operationen für jeden Wert ausführen müssten, bleibt die lineare Beziehung bei einigen Verarbeitungsvorgängen bestehen. O(2n) ist als Deskriptor einfach nicht nützlich, da es genau die gleiche Skalierbarkeit wie O beschreiben würdeO(n) .

Ich weiß zu schätzen, dass viele dieser Antworten Sie grundsätzlich dazu auffordern, selbst zu diesem Schluss zu kommen, indem Sie die Definition von Big-O lesen. Aber dieses intuitive Verständnis hat eine ganze Weile gedauert, bis ich meinen Kopf umwickelt habe, und deshalb habe ich es Ihnen so klar wie möglich dargelegt.


5
Das größte Problem bei dieser Art von Antwort ist, dass sie nicht die Definition von Big Oh berührt, sondern sie nur als eine Art intuitive Magie verwendet, wie in "Sehen Sie, wann Sie dies und das tun, es ist ". Persönlich finde ich es viel lehrreicher, jemandem zu sagen, dass Big Oh absolut nichts mit Algorithmen zu tun hat, und damit zu beginnen. O(n)
Juho

3
@Juho Instruktiv vielleicht, aber letztendlich nutzlos für die große Mehrheit der Informatiker.
Streuung

4
Dem muss ich nicht zustimmen. Sich als Informatiker zu bezeichnen, sollte keine Entschuldigung dafür sein, nicht zu verstehen, was eine Notation bedeutet, dh die ganze Mathematik zu überspringen.
Juho

3
Ja. Ich habe nichts dagegen einzuwenden Programmierer nicht das Zeug zu verstehen , aber wenn Sie sich einen Computer nennen wollen Wissenschaftler , dann ist das Kernmaterial.
David Richerby

2
@dkaeae Nein, ich beziehe mich auf Leute, die andere Karrieren auf dem Gebiet haben, wie zum Beispiel Softwareentwickler.
Streuung

5

Sie können O(f) für jede Funktion f schreiben und es ist absolut sinnvoll. Gemäß der Definition ist g(n)=O(f(n)) wenn es eine Konstante c so dassg(n)cf(n) für alle groß genug n . Nichts in dieser Definition besagt, dassf eine Art "nette" Funktion sein muss.

Wie andere Antworten gezeigt haben, beschreiben g(n)=O(f(n)) und G(n)=Ö(2f(n)) genau dieselbe Situation: wenn G(n)cf(n) für alle alle groß genug n , dann haben wir auchg(n)c22f(n), alsog(n)=O(2f(n)) (wobei die Konstantec/2 ).

Schreiben Sie als Nebenproblem nicht " logn2 ", da nicht 100% klar ist, was es bedeutet. Man könnte sagen, dass es offensichtlich bedeutetlog(n2) aber fast jeder würde das als2logn schreiben, so dass der Leser Zweifel hat.

O


4

Schauen Sie sich die Definition von O (f (n)) an und Sie sehen, dass zum Beispiel O (2n ^ 2) und O (n ^ 2) genau gleich sind. Das Ändern eines Algorithmus von 5n ^ 2 auf 3n ^ 2 Operationen ist eine 40-prozentige Verbesserung. Der Wechsel von O (5n ^ 2) zu O (3n ^ 2) ist eigentlich keine Änderung, sie sind gleich.

Lesen Sie erneut die Definition von O (f (n)).


4

Ö(f(n))={G(n)|n,c>0::m>n::c×G(m)f(m)}}

=

Ö(n)=Ö(2n)


4
Log(n!)=nLogn- -n+Ö(Logn)Ö(f)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.