Verwirrt über Big-O-Notation

8

Ich habe zwei Fragen:

%Vor%

Frage 1: Ist das in O (n)? Ist es wichtig, wie viele Schleifen (nicht verschachtelte Schleifen) in method1 sind?

Frage 2: Was ist, wenn es ein

gibt? %Vor%

innerhalb der method1 , welche Funktion ist es?

    
Sam 16.03.2013, 22:02
quelle

2 Antworten

7
  

Frage 1: Ist das in O (n)?

Das ist richtig (hier bezeichnet n die Länge jedes der beiden Arrays).

  

Ist es wichtig, wie viele Schleifen (nicht verschachtelte Schleifen) in Methode 1 sind?

Dies ist nicht der Fall, solange die Anzahl der Schleifen fest ist und die Anzahl der Iterationen in jeder Schleife in n linear ist. Formal ausgedrückt, wenn C eine Konstante ist, ist C*n O(n) .

  

Frage 2: Was ist, wenn es ein Arrays.sort(a);

gibt?

Die Sortierung erfolgt normalerweise O(n logn) , und dies ist Arrays.sort(int[]) macht im Durchschnitt . Die Dokumentation ist vage über die Worst-Case-Leistung:

  

Dieser Algorithmus bietet O (n log (n)) -Leistung für viele Datensätze, die andere Quicksorts zu einer quadratischen Leistung führen, und ist in der Regel schneller als herkömmliche QuickSort-Implementierungen (ein Pivot).

Dies garantiert deutlich, dass O(n logn) im worst case nicht garantiert ist. Das Lesen zwischen den Zeilen deutet darauf hin, dass es wahrscheinlich O(n^2) ist.

Es ist interessant zu bemerken, dass in JDK7 Arrays.sort(Object[]) verwendet einen anderen Algorithmus als der von Arrays.sort(int[]) . Ersteres ist eine Anpassung von TimSort und sollte daher% code% der Worst-Case-Leistung garantieren. Leider hört die Dokumentation wieder auf, dies nicht zu buchstabieren.

    
NPE 16.03.2013, 22:05
quelle
1
  1. a. Es ist O (n) wobei n = Länge der Eingabe (gesamt)
    b. Ja, es ist wichtig, wie viele Schleifen es gibt: Wenn es eine konstante Anzahl von Schleifen k ist, dann ist es O (k * n), das normalerweise als O (n) betrachtet wird, aber wenn k & gt; = n ist, sollte etwas berücksichtigt werden / p>

  2. Arrays.sort(a); wird mit merge sort implementiert, das in O (n log n) sowohl im Durchschnitt als auch im schlimmsten Fall läuft (nicht wie NPE sagte!).

Update für MrSmith42:

Von Ссылка :
der Algorithmus sort (Object []) muss kein MergeSort sein, muss aber stabil sein.)

Und auch:

Implementierungshinweis: Der Sortieralgorithmus ist ein Dual-Pivot Quicksort von Vladimir Yaroslavskiy, Jon Bentley und Joshua Bloch. Dieser Algorithmus bietet O (n log (n)) -Leistung für viele Datensätze, die andere Quicksorts zu einer quadratischen Leistung führen, und ist in der Regel schneller als herkömmliche (ein Pivot) Quicksort-Implementierungen.

    
alfasin 16.03.2013 22:10
quelle

Tags und Links