Ich bevorzuge so wenig formale Definitionen wie möglich und einfache Mathematik.
Cdiggins, was, wenn ich O(N/2) Komplexität haben, sollte es O(N) oder O(N/2), zum Beispiel, was die Komplexität, wenn ich über die Hälfte String Schleife wird.
Ich bevorzuge so wenig formale Definitionen wie möglich und einfache Mathematik.
Die Big-O-Schreibweise wird von Programmierern meist als Näherungswert dafür verwendet, wie lange eine Berechnung (ein Algorithmus) in Abhängigkeit von der Größe der Eingabemenge dauert.
Big O ist nützlich, um zu vergleichen, wie gut zwei Algorithmen skalieren, wenn die Anzahl der Eingaben erhöht wird.
Genauer gesagt Big-O-Notation wird verwendet, um das asymptotische Verhalten einer Funktion auszudrücken. Das heißt, wie sich die Funktion verhält, wenn sie sich dem Unendlichen nähert.
In vielen Fällen wird das "O" eines Algorithmus in einen der folgenden Fälle fallen:
Big O ignoriert Faktoren, die nicht in sinnvoller Weise zur Wachstumskurve einer Funktion beitragen, wenn die Eingabegröße gegen unendlich ansteigt. Das bedeutet, dass Konstanten, die zur Funktion addiert oder mit ihr multipliziert werden, einfach ignoriert werden.
Cdiggins, was, wenn ich O(N/2) Komplexität haben, sollte es O(N) oder O(N/2), zum Beispiel, was die Komplexität, wenn ich über die Hälfte String Schleife wird.
Big O ist nur eine Möglichkeit, sich auf eine gängige Art und Weise auszudrücken: "Wie viel Zeit / Platz braucht es, um meinen Code auszuführen?".
Man sieht oft O(n), O(n 2 ), O(nlogn) und so weiter, all das sind nur Möglichkeiten zu zeigen: Wie ändert sich ein Algorithmus?
O(n) bedeutet, dass Big O gleich n ist, und jetzt werden Sie vielleicht denken: "Was ist n!?" Nun, "n" ist die Anzahl der Elemente. Stellen Sie sich vor, Sie wollen nach einem Element in einem Array suchen. Im schlimmsten Fall befindet sich das Element am letzten Index, was bedeutet, dass die Suche so viel Zeit in Anspruch nimmt, wie es Elemente in der Liste gibt, also sagen wir ganz allgemein: "Oh hey, n ist eine angemessene Anzahl von Werten!
Dann werden Sie vielleicht verstehen, was "n 2 " bedeutet, aber um noch konkreter zu werden, spielen Sie mit dem Gedanken, dass Sie einen einfachen, den einfachsten der Sortieralgorithmen haben; Bubblesort. Dieser Algorithmus muss die gesamte Liste nach jedem Element durchsuchen.
Meine Liste
Der Ablauf wäre hier folgender:
Dies ist O n 2 weil Sie alle Einträge in der Liste betrachten müssen, die aus "n" Einträgen besteht. Für jedes Element schauen Sie sich alle Elemente noch einmal an, um zu vergleichen, ist dies auch "n", so dass Sie für jedes Element "n" Mal schauen, was n*n = n bedeutet 2
Ich hoffe, das ist so einfach, wie Sie es sich wünschen.
Aber denken Sie daran: Big O ist nur eine Möglichkeit, sich selbst in Zeit und Raum zu erleben.
Big O beschreibt die grundlegende Skalierung eines Algorithmus.
Es gibt viele Informationen, die Big O Ihnen nicht über einen bestimmten Algorithmus mitteilt. Es gibt nur Informationen über die Skalierung eines Algorithmus, insbesondere darüber, wie der Ressourcenverbrauch (z. B. Zeit oder Speicher) eines Algorithmus in Abhängigkeit von der "Eingabegröße" skaliert.
Betrachten Sie den Unterschied zwischen einer Dampfmaschine und einer Rakete. Es handelt sich nicht nur um verschiedene Varianten derselben Sache (wie z. B. ein Prius-Motor im Vergleich zu einem Lamborghini-Motor), sondern sie sind im Kern völlig unterschiedliche Antriebssysteme. Eine Dampfmaschine mag schneller sein als eine Spielzeugrakete, aber kein Dampfkolbenmotor wird die Geschwindigkeiten einer Trägerrakete im Orbit erreichen. Das liegt daran, dass diese Systeme unterschiedliche Skalierungseigenschaften haben, was das Verhältnis des benötigten Treibstoffs ("Ressourcenverbrauch") zum Erreichen einer bestimmten Geschwindigkeit ("Inputgröße") angeht.
Warum ist das so wichtig? Weil Software mit Problemen zu tun hat, die sich in ihrer Größe um Faktoren von bis zu einer Billion unterscheiden können. Überlegen Sie sich das einen Moment lang. Das Verhältnis zwischen der Geschwindigkeit, die man braucht, um zum Mond zu reisen, und der menschlichen Gehgeschwindigkeit beträgt weniger als 10.000:1, und das ist absolut winzig im Vergleich zu der Bandbreite an Eingabegrößen, mit denen Software konfrontiert werden kann. Und da Software mit einer astronomischen Bandbreite an Eingabegrößen konfrontiert sein kann, besteht die Möglichkeit, dass die Big-O-Komplexität eines Algorithmus, also seine grundlegende Skalierungsnatur, alle Implementierungsdetails übertrumpft.
Betrachten Sie das Beispiel der kanonischen Sortierung. Bubble-Sortierung ist O(n 2 ), während Merge-Sortierung O(n log n) ist. Nehmen wir an, Sie haben zwei Sortieranwendungen, Anwendung A, die Bubble-Sort verwendet, und Anwendung B, die Merge-Sort verwendet, und nehmen wir an, dass bei Eingabegrößen von etwa 30 Elementen Anwendung A beim Sortieren 1.000x schneller ist als Anwendung B. Wenn Sie nie viel mehr als 30 Elemente sortieren müssen, ist es offensichtlich, dass Sie Anwendung A bevorzugen sollten, da sie bei diesen Eingabegrößen viel schneller ist. Wenn Sie jedoch feststellen, dass Sie vielleicht zehn Millionen Elemente sortieren müssen, dann ist Anwendung B in diesem Fall erwartungsgemäß Tausende Male schneller als Anwendung A, was ausschließlich auf die Art und Weise zurückzuführen ist, wie jeder Algorithmus skaliert.
Hier ist das einfache englische Bestiarium, das ich zu verwenden pflege, wenn ich die gängigen Big-O-Varianten erkläre
In allen Fällen sind Algorithmen, die weiter oben auf der Liste stehen, denjenigen vorzuziehen, die weiter unten auf der Liste stehen. Die Kosten für den Wechsel zu einer teureren Komplexitätsklasse sind jedoch sehr unterschiedlich.
O(1):
Kein Wachstum. Unabhängig davon, wie groß das Problem ist, kann man es in der gleichen Zeit lösen. Dies ist in gewisser Weise vergleichbar mit dem Rundfunk, bei dem die gleiche Energiemenge für die Übertragung über eine bestimmte Entfernung benötigt wird, unabhängig von der Anzahl der Personen, die sich im Sendebereich befinden.
O(log n ):
Diese Komplexität ist die gleiche wie O(1) Nur dass es noch ein bisschen schlimmer ist. Für alle praktischen Zwecke können Sie dies als eine sehr große konstante Skalierung betrachten. Der Unterschied im Arbeitsaufwand zwischen der Verarbeitung von 1.000 und 1 Milliarde Elementen beträgt nur den Faktor sechs.
O( n ):
Die Kosten für die Lösung des Problems sind proportional zur Größe des Problems. Wenn sich die Größe des Problems verdoppelt, verdoppeln sich auch die Kosten für die Lösung. Da die meisten Probleme auf irgendeine Weise in den Computer eingescannt werden müssen, z. B. durch Dateneingabe, Festplattenlesung oder Netzwerkverkehr, ist dies im Allgemeinen ein vertretbarer Skalierungsfaktor.
O( n Protokoll n ):
Diese Komplexität ist sehr ähnlich zu O( n ) . Für alle praktischen Zwecke sind die beiden gleichwertig. Dieser Grad an Komplexität würde im Allgemeinen noch als skalierbar angesehen werden. Wenn man die Annahmen etwas verändert O( n Protokoll n ) Algorithmen können umgewandelt werden in O( n ) Algorithmen. Durch die Begrenzung der Größe der Schlüssel wird beispielsweise die Sortierung von O( n Protokoll n ) zu O( n ) .
O( n 2 ):
Wächst als Quadrat, wobei n ist die Länge der Seite eines Quadrats. Dies ist die gleiche Wachstumsrate wie der "Netzwerkeffekt", bei dem jeder in einem Netzwerk jeden anderen im Netzwerk kennen könnte. Wachstum ist teuer. Die meisten skalierbaren Lösungen können Algorithmen mit diesem Komplexitätsgrad nicht verwenden, ohne dass es zu erheblichen Kunststücken kommt. Dies gilt im Allgemeinen für alle anderen polynomialen Komplexitäten - O( n k ) - auch.
O(2 n ):
Skaliert nicht. Sie haben keine Chance, ein Problem von nichttrivialer Größe zu lösen. Nützlich, um zu wissen, was zu vermeiden ist, und für Experten, um ungefähre Algorithmen zu finden, die in O( n k ) .
Big O ist ein Maß dafür, wie viel Zeit/Speicherplatz ein Algorithmus im Verhältnis zur Größe seiner Eingabe benötigt.
Wenn ein Algorithmus O(n) ist, dann wächst die Zeit/der Raum mit der gleichen Rate wie seine Eingabe.
Wenn ein Algorithmus O(n 2 ), dann wächst die Zeit/der Raum im Verhältnis zum Quadrat des Inputs.
und so weiter.
Ich habe immer geglaubt, dass es um Zeit ODER Raum gehen kann, aber nicht um beides gleichzeitig.
Komplexität kann sehr wohl mit Raum zu tun haben. Schauen Sie sich das an: de.wikipedia.org/wiki/PSPACE
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
69 Stimmen
Zusammenfassung: Die obere Grenze der Komplexität eines Algorithmus. Siehe auch die ähnliche Frage Big O, wie berechnest/schätzt du das? für eine gute Erläuterung.
7 Stimmen
Die anderen Antworten sind recht gut, nur ein Detail zum Verständnis: O(log n) oder ähnlich bedeutet, dass es von der "Länge" oder "Größe" der Eingabe abhängt, nicht von dem Wert selbst. Das kann schwer zu verstehen sein, ist aber sehr wichtig. Dies ist zum Beispiel der Fall, wenn Ihr Algorithmus bei jeder Iteration Dinge in zwei Teile zerlegt.
1 Stimmen
Wenn dies ein Duplikat von etwas ist, dann ist es das: stackoverflow.com/questions/107165/big-o-for-eight-year-olds
18 Stimmen
Es gibt eine Vorlesung über die Komplexität der Algorithmen in der Vorlesung 8 des MIT-Kurses "Introduction to Computer Science and Programming". youtube.com/watch?v=ewd7Lf2dr5Q Es ist nicht ganz einfaches Englisch, aber es gibt schöne Erklärungen mit Beispielen, die leicht verständlich sind.
19 Stimmen
Big O ist eine Schätzung der schlechtesten Leistung einer Funktion unter der Annahme, dass der Algorithmus die maximale Anzahl von Iterationen durchführt.
1 Stimmen
Ich denke, Sie werden das finden: youtube.com/watch?v=6Ol2JbwoJp0 Video hilfreich.
3 Stimmen
So können wir die Effizienz unserer Lösung mit anderen Lösungen vergleichen. Einfache Zeittests sind aufgrund externer Variablen (z. B. Hardware und Problemgröße (z. B. Anzahl der zu sortierenden Objekte)) nicht möglich. Big-O ermöglicht es uns, die Vergleiche zu standardisieren.
38 Stimmen
Big-O notation explained by a self-taught programmer
1 Stimmen
Siehe dies Vorführung .
2 Stimmen
Die Big-O-Notation hat eigentlich nichts mit Algorithmen und Komplexität zu tun.
1 Stimmen
Wenn Sie wirklich etwas über die Landau-Notation lernen wollen, empfehle ich Ihnen die Seite Informatik , beginnend mit unsere Referenzfragen . Wir geben zwar nicht vor, ein mathematisches Konzept genau erklären zu können und in "einfachem Englisch", wir werden Ihnen auch keine Unwahrheiten beibringen. (Hoffentlich.)
0 Stimmen
Erklärung in einem Satz: "Eine Funktion wächst nicht schneller als eine andere".
0 Stimmen
In diesem Beitrag wird die Komplexität anhand eines konkreten Beispiels erläutert: mohalgorithmsorbit.blogspot.com/2021/01/
0 Stimmen
@HaraldSchilly "hängt von der "Länge" oder "Größe" der Eingabe ab, nicht auf den Wert selbst "? Könnten Sie mir das bitte genauer erklären?