Ich lese diesen Beitrag auf Big-O.
Es heißt, dass der folgende Code O (n ^ 2) ist:
bool ContainsDuplicates(String[] strings)
{
for(int i = 0; i < strings.Length; i++)
{
for(int j = 0; j < strings.Length; j++)
{
if(i == j) // Don't compare with self
{
continue;
}
if(strings[i] == strings[j])
{
return true;
}
}
}
return false;
}
Aber ich kann nicht verstehen warum.
Die innere Schleife macht etwas Konstantes.
Es ist also die Summe von 1 .... N einer Konstanten. dh konstante Zahl O (1).
Die äußere Schleife ist eine Summation über dem O (1).
Ich würde mir also vorstellen, dass es n * O (1) ist.
Ich glaube, ich verstehe hier etwas falsch.
Ich glaube nicht, dass alle verschachtelten Schleifen O (n ^ 2) bedeuten, oder?
algorithms
performance
complexity
big-o
user10326
quelle
quelle
i+1
statt beginnt0
. Wie geschrieben, sind im schlimmsten Fall (keine Dupes) 1/2 die Vergleiche redundant.O(N)
, dieser Code tatsächlichO(N^2 * M)
dort ist , wo M die Länge der Zeichenfolgen ist.Antworten:
Ihr Fehler liegt in der inneren Schleife. Es macht n- mal etwas Konstantes , also ist es O ( n ). Die äußere Schleife führt die innere Schleife n- mal durch, also ist es O ( n × n ) oder O ( n 2 ).
Wenn die Anzahl der Iterationen, die eine Schleife durchführt, von der Größe der Eingabe abhängt, ist sie im Allgemeinen O ( n ). Und wenn k solche Schleifen verschachtelt sind, ist es O ( n k ).
quelle
ContainsDuplicates
Funktion / Methode aus der Frage wahrscheinlich nicht mit vollen Chromosomen verwendet.Wenn die Länge der Zeichenfolge gleich ist
n
, wird der Test ifi == j
n ^ 2 Mal ausgeführt. Die Reihenfolge eines Algorithmus ist die Reihenfolge des Teils, der die höchste Ordnung hat. Da 'i' zweimal mit 'j' n ^ 2 verglichen wird, kann die Reihenfolge des Algorithmus unmöglich kleiner sein alsO(n^2)
.Bei einem sehr großen 'n' vervierfacht das Verdoppeln von 'n' die Laufzeit.
quelle
i==j
ein O (1)?Sie interpretieren falsch, was eine konstante Operation bedeutet.
Eine konstante Operation ist eine Operation, die unabhängig von der empfangenen Eingabe immer in fester Zeit ausgeführt wird.
i == j ist eine konstante Operation, da diese Anweisung in fester Zeit ausgeführt wird. Nehmen wir an, es dauert 1 Zeiteinheit.
Diese konstante Operation wird jedoch mal ausgeführt (Anzahl der Werte von i) * (Anzahl der Werte von j). Nehmen wir an, i und j werden jeweils zehnmal ausgeführt. Dann dauert es nach Berechnung 100 Zeiteinheiten, bis i == j in einer verschachtelten Schleife abgeschlossen ist. Es wird also variieren, wenn die Werte von i und j variieren.
Wir können sicher sein, dass i == j in 1 Zeiteinheit ausgeführt wird, aber wir können nicht wissen, wie oft i == j ausgeführt wird.
Wenn es n-mal ausgeführt wird, dauert es n Zeiteinheiten. Die äußere Schleife führt die innere Schleife n-mal aus. Im Wesentlichen werden i == j-Operationen n ^ 2 Mal ausgeführt.
Alle verschachtelten Schleifen bedeuten O (n ^ (Anzahl der verschachtelten Schleifen)). Hier bedeutet O die Obergrenze, was bedeutet, dass Code kleiner oder gleich dem Wert von O () ausgeführt wird. Dies ist die Garantie, dass es nicht länger dauert, aber es kann weniger Zeit dauern, nicht größer.
quelle
Verschachtelte Schleifen führen O ( i 1 * i 2 * ... * i n ) aus, wobei n die Anzahl der verschachtelten Schleifen und i x die Anzahl der Iterationen in der Schleife x ist . (Oder anders ausgedrückt, es ist das Produkt der Anzahl der Iterationen in jeder der Schleifen.)
Ihr Schleifenpaar iteriert zweimal über dasselbe Array, was zufällig O (n * n) oder O (n 2 ) ist.
Was in der innersten Schleife passiert, wird als konstant behandelt, da es jedes Mal passieren wird. Bei der Big-O-Notation geht es nicht wirklich darum, die Leistung von linearem Code zu messen, sondern vielmehr darum, relative Vergleiche des Verhaltens iterativer Algorithmen anzustellen, wenn n Eingabeelemente zur Behandlung gegeben werden. Bestimmte Operationen, die keine Iteration ausführen (z. B. Push oder Pop auf einem Stapel), werden als O (1) bezeichnet, da sie ein Element der Daten verarbeiten.
quelle