Überblick
Andere haben gute Diagrammbeispiele gegeben, wie zum Beispiel die Baumdiagramme. Ich habe keine einfachen Codebeispiele gesehen. Zusätzlich zu meiner Erklärung werde ich einige Algorithmen mit einfachen Druckanweisungen versehen, um die Komplexität verschiedener Algorithmuskategorien zu veranschaulichen.
Zunächst möchten Sie eine allgemeine Vorstellung vom Logarithmus haben, die Sie unter https://en.wikipedia.org/wiki/Logarithm erhalten . Naturwissenschaftliche Nutzung e
und das natürliche Protokoll. Technische Schüler verwenden log_10 (log base 10) und Informatiker verwenden log_2 (log base 2) häufig, da Computer binär basieren. Manchmal werden Abkürzungen für natürliches Protokoll ln()
angezeigt, da Ingenieure normalerweise die _10 weglassen und nur verwenden log()
und log_2 als abgekürzt wird lg()
. Alle Arten von Logarithmen wachsen auf ähnliche Weise, weshalb sie dieselbe Kategorie von Logarithmen haben log(n)
.
Wenn Sie sich die folgenden Codebeispiele ansehen, empfehle ich, sich O (1), dann O (n) und dann O (n ^ 2) anzusehen. Nachdem Sie mit diesen gut sind, schauen Sie sich die anderen an. Ich habe saubere Beispiele sowie Variationen beigefügt, um zu demonstrieren, wie subtile Änderungen immer noch zu derselben Kategorisierung führen können.
Sie können sich O (1), O (n), O (logn) usw. als Klassen oder Kategorien des Wachstums vorstellen. Einige Kategorien benötigen mehr Zeit als andere. Diese Kategorien geben uns eine Möglichkeit, die Leistung des Algorithmus zu ordnen. Einige sind schneller gewachsen, wenn die Eingabe n wächst. Die folgende Tabelle zeigt das Wachstum numerisch. Stellen Sie sich in der folgenden Tabelle log (n) als die Obergrenze von log_2 vor.
Einfache Codebeispiele für verschiedene Big O-Kategorien:
O (1) - Beispiele für konstante Zeit:
Algorithmus 1 druckt Hallo einmal und es hängt nicht von n ab, so dass es immer in konstanter Zeit ausgeführt wird, so ist es O(1)
.
print "hello";
Algorithmus 2 gibt dreimal Hallo aus, hängt jedoch nicht von der Eingabegröße ab. Selbst wenn n wächst, druckt dieser Algorithmus immer nur dreimal Hallo. Davon abgesehen ist 3 eine Konstante, also ist dieser Algorithmus auch O(1)
.
print "hello";
print "hello";
print "hello";
O (log (n)) - Logarithmische Beispiele:
- Algorithmus 3 - Dies verhält sich wie "log_2"
Algorithmus 3 zeigt einen Algorithmus, der in log_2 (n) ausgeführt wird. Beachten Sie, dass die Nachoperation der for-Schleife den aktuellen Wert von i mit 2 multipliziert, also i
von 1 nach 2 nach 4 nach 8 nach 16 nach 32 geht ...
for(int i = 1; i <= n; i = i * 2)
print "hello";
- Algorithmus 4 - Dies verhält sich wie "log_3"
Algorithmus 4 demonstriert log_3. Hinweis i
geht von 1 bis 3 bis 9 bis 27 ...
for(int i = 1; i <= n; i = i * 3)
print "hello";
- Algorithmus 5 - Dies verhält sich wie "log_1.02"
Algorithmus 5 ist wichtig, da er zeigt, dass Sie einen logarithmischen Algorithmus betrachten, solange die Zahl größer als 1 ist und das Ergebnis wiederholt mit sich selbst multipliziert wird.
for(double i = 1; i < n; i = i * 1.02)
print "hello";
O (n) - Beispiele für lineare Zeit:
Dieser Algorithmus ist einfach und druckt n-mal.
for(int i = 0; i < n; i++)
print "hello";
Dieser Algorithmus zeigt eine Variation, bei der n / 2 Mal Hallo gedruckt wird. n / 2 = 1/2 * n. Wir ignorieren die 1/2 Konstante und sehen, dass dieser Algorithmus O (n) ist.
for(int i = 0; i < n; i = i + 2)
print "hello";
O (n * log (n)) - nlog (n) Beispiele:
Stellen Sie sich dies als eine Kombination von O(log(n))
und vor O(n)
. Das Verschachteln der for-Schleifen hilft uns, die zu erhaltenO(n*log(n))
for(int i = 0; i < n; i++)
for(int j = 1; j < n; j = j * 2)
print "hello";
Algorithmus 9 ist wie Algorithmus 8, aber jede der Schleifen hat Variationen zugelassen, die immer noch zum Endergebnis führen O(n*log(n))
for(int i = 0; i < n; i = i + 2)
for(int j = 1; j < n; j = j * 3)
print "hello";
O (n ^ 2) - n im Quadrat Beispiele:
O(n^2)
wird leicht durch Verschachtelungsstandard für Schleifen erhalten.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
print "hello";
Wie Algorithmus 10, jedoch mit einigen Variationen.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j = j + 2)
print "hello";
O (n ^ 3) - n gewürfelt Beispiele:
Dies ist wie bei Algorithmus 10, jedoch mit 3 Schleifen anstelle von 2.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
print "hello";
Wie Algorithmus 12, jedoch mit einigen Variationen, die immer noch ergeben O(n^3)
.
for(int i = 0; i < n; i++)
for(int j = 0; j < n + 5; j = j + 2)
for(int k = 0; k < n; k = k + 3)
print "hello";
Zusammenfassung
Die obigen Beispiele enthalten einige einfache Beispiele und Variationen, um zu demonstrieren, welche subtilen Änderungen eingeführt werden können, die die Analyse wirklich nicht ändern. Hoffentlich gibt es Ihnen genug Einblick.