Ich habe den folgenden Algorithmus, der Duplikate findet und entfernt:
public static int numDuplicatesB(int[] arr) {
Sort.mergesort(arr);
int numDups = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] == arr[i - 1]) {
numDups++;
} }
return numDups;
}
Ich versuche, die schlimmste zeitliche Komplexität zu finden. Ich weiß, dass Mergesort ist nlog(n)
, und in meiner for-Schleife iteriere ich über den gesamten Datensatz, sodass dies als gilt n
. Ich bin mir jedoch nicht sicher, was ich mit diesen Zahlen anfangen soll. Soll ich sie einfach zusammenfassen? Wenn ich das machen würde, wie würde ich es machen?
algorithms
algorithm-analysis
big-o
Chopper zeichnen lion4
quelle
quelle
Antworten:
Für die Komplexität von Big O ist alles, was Sie interessiert, der vorherrschende Begriff.
n log(n)
dominiertn
, das ist also der einzige Begriff, den Sie interessieren.quelle
f(n) is O(g(n))
was wir wirklich sagen, dass die Funktion istf is a member of the set of functions that grows at the rate of at most g(n) over the long term
. Dies bedeutet, dass alle Mitglieder vonO(n)
auch Mitglieder von sindO(n*log(n))
. Die+
in-Ausdrücke wieO(f(n)) + O(g(n))
beziehen sich tatsächlich auf set union (welche von Ihnen wirklich pedantisch sind, sollten Sie wirklich verwenden use).A + B = { a + b | a in A, b in B }
. Es kommt vor, dass dies für Mengen der FormO(g(n))
dasselbe ist wie für Mengenvereinigung , da eine der Mengen immer eine Teilmenge der anderen ist und beide für Summen unveränderlich sind (dh A + A = A). (Hoppla, Nate hat im Wesentlichen dasselbe geschrieben).Lassen Sie uns darüber nachdenken und uns an die Definition von erinnern
O
. Die, die ich verwenden werde, ist für die Grenze im Unendlichen.Sie haben Recht, wenn Sie angeben, dass Sie zwei Operationen mit entsprechenden asymptotischen Grenzen von ausführen
O(n)
undO(nlog(n))
diese jedoch zu einer einzigen Grenze kombinieren, ist dies nicht so einfach wie das Hinzufügen der beiden Funktionen. Sie wissen, dass Ihre Funktion mindestensO(n)
Zeit und auch mindestensO(nlog(n))
Zeit benötigt. Die Komplexitätsklasse für Ihre Funktion ist also wirklich die Vereinigung vonO(n)
und istO(nlog(n))
aberO(nlog(n))
eine Obermenge von,O(n)
also wirklich ist es gerechtO(nlog(n))
.quelle
Wenn du es auf lange Sicht darlegen würdest, würde es ungefähr so aussehen:
Angenommen, die Gesamtzeit ist: a + bn log (n), wobei a und b Konstanten sind (Terme niedrigerer Ordnung werden ignoriert).
Wenn n gegen unendlich geht (an + bn log (n)) / n log (n) -> a / log (n) + b -> b
Die Gesamtzeit ist also O (bn log (n)) = O (n log (n)).
quelle
Beginnen Sie mit der Definition von O ():
O (n log n) bedeutet "kleiner als C n log n, wenn n groß ist".
O (n) bedeutet "kleiner als D n, wenn n groß ist".
Wenn Sie beide addieren, ist das Ergebnis kleiner als C n log n + D n <C n log n + D n log n <(C + D) n log n = O (n log n).
Wenn im Allgemeinen f (n)> C g (n) für großes n und etwas C> 0 ist, dann ist O (f (n)) + O (g (n)) = O (f (n)). Und nachdem Sie einige Fälle mit der Definition von O () bearbeitet haben, wissen Sie, was Sie können und was nicht.
quelle
Die große O-Notation wird als eine Menge definiert:
So enthält alle Funktionen, die - von einem beliebigen großen Ausgangspunkt - immer kleiner als g.
Wenn Sie nun eine Funktion haben, die aktiviert ist, und dann eine andere ausführen, die langsamer als g ansteigt, steigt sie mit Sicherheit langsamer als 2 g an. Wenn Sie also etwas langsamer als g ausführen, ändert sich die Komplexitätsklasse nicht.
Formeller:
Das können Sie leicht beweisen.
TL; DR
Es ist immer noch
quelle