2016-06-11 13 views
1

Dieser Algorithmus kehrt ein Array von N ganzen Zahlen um. Ich glaube, dass dieser Algorithmus O (N) ist, weil für jede Schleifeniteration die vier Codezeilen einmal ausgeführt werden, wodurch der Job in 4N Zeit abgeschlossen wird.Ich glaube, dieser Algorithmus ist O (N). Hab ich recht?

public static void reverseTheNumbers(int[] list) { 
    for (int i = 0; i < list.length/2; i++) { 
     int j = list.length - 1 - i; 
     int temp = list[i]; 
     list[i] = list[j]; 
     list[j] = temp; 
    } 
} 
+2

Ich würde nicht sagen, es ist "den Job in 4N Zeit konkurrieren", aber es ist in der Tat O (N). – khelwood

+0

Mein Verständnis ist, dass Sie in großer O-Notation die Komplexität des Algorithmus in Bezug auf Eingabe und Ausgabe messen. In diesem Fall ist Ihre Eingabe ein Array von N Zahlen, aber die Ausgabe ist auch ein Array von N Elementen (da void wie nichts zurückgibt, bin ich mir nicht sicher, ob das korrekt ist). Aber von dieser Annahme wäre die Komplexität O (1) –

+0

@manuelmourato der Ausgangstyp hat nichts damit zu tun, ob der Algorithmus O (N) ist. – khelwood

Antwort

6

Es gibt nicht so etwas wie 4N Zeit. Der Algorithmus ist linear, da die Laufzeit des Algorithmus proportional zunimmt, wenn Sie die Größe der Eingabe erhöhen. Mit anderen Worten, wenn Sie die Größe von list verdoppelt haben, würden Sie erwarten, dass der Algorithmus doppelt so lange dauert.

Es spielt keine Rolle, wie viele Operationen Sie innerhalb Ihrer Schleife ausführen - solange sie jede konstante Zeit (relativ zur Eingabe) sind, wird die Laufzeit der Schleife einfach durch die Anzahl der Iterationen bestimmt.

Mit anderen Worten, diese vier Aussagen sind - alle zusammen - eine O (1) -Operation.

int j = list.length - 1 - i; 
int temp = list[i]; 
list[i] = list[j]; 
list[j] = temp; 

Es gibt nichts signifikant über die Tatsache, dass diese Abfolge von Schritten in vier Aussagen in Java-Syntax ausgedrückt wird - mit javap experimentieren diese vier Linien Befehle kompiliert in ~ 20 Bytecode schon sagt, und wer weiß, wie viele Prozessorbefehle, die Bytecode wird in konvertiert. Die gute Nachricht ist, dass die Big-O-Notation unabhängig von der jeweiligen Syntax gleich funktioniert - eine Folge von Operationen ist O (1) oder konstante Zeit, wenn ihre Ausführungszeit unabhängig von der Eingabe gleich ist.

Daher machen Sie eine O (1) Operation N-mal; alias O (N).

+1

Richtig, ich wollte sagen, dass jede Anweisung 4N mal ausgeführt wird. – aaronvan

+0

Das ist immer noch asymptotisch O (n) - konstante Multiplikatoren wie 4 beeinflussen nicht die Laufzeit eines Algorithmus * relativ zur Eingabe *. – dimo414

4

Ja, Sie haben Recht. Die Anzahl der Operationen ist linear abhängig von der Größe des Arrays (N), was es zu einem O (N) -Algorithmus macht.

1

Ja, die Komplexität des Algorithmus ist O (n). Allerdings ist die genaue "Zeit" (weil es keine konstanten Faktoren in asymptotischer Komplexität gibt, siehe Kommentar unten) nicht 4 mal so groß wie das Array, wir könnten sagen, es ist 1/2 * (c1 + c2 + c3 + c3) mal die Größe des Arrays, wobei 1/2 jeder Schleifeniteration entspricht und jedes c der Zeit entspricht, die für jede Operation innerhalb der Schleife benötigt wird. Es wäre 4-mal so groß wie das Array, wenn der Algorithmus das ganze Array 4-mal durchlaufen würde.

+2

"* Es wäre 4N, wenn der Algorithmus das ganze Array 4 mal durchlaufen würde. *" - nein, viermal über eine Liste zu iterieren, ist immer noch O (n). Bei der asymptotischen Komplexität gibt es keine konstanten Faktoren. – dimo414

+0

Das stimmt, es war ein Tippfehler auf meiner Seite. Selbst wenn die benötigte Zeit 4N beträgt, ist die asymptotische Komplexität immer noch O (N). Die Komplexität wurde durch "Zeit" ersetzt, um Fehlinterpretationen zu vermeiden. Ich hoffe es hilft. – Dimos

+0

Sie verwenden immer noch "4N", was bestenfalls verwirrend ist, da es immer noch in N ausgedrückt ist. Sie könnten "4x" oder "viermal so lang" sagen, wenn Sie nicht über die asymptotische Komplexität sprechen. – dimo414