2016-05-06 8 views
1

Was wäre die Zeit Komplexität der Methode unten und warum?Was wäre die zeitliche Komplexität und warum?

Ich weiß, dass es wegen der ersten for-Schleife größer als O (n) sein muss.

Aber was passiert mit der Zeit Komplexität nach der While-Schleife?

Ist es O (n) (n-1) = O (n^2 + n)?

int fnA(int n) { 
    int sum=0; 
    for (int i=0; i<n; i++) { 
     int j=i; 
     int product =1; 
     while (j>1) { 
      product ∗= j ; 
      j = j/2; 
     } 
     sum += product; 
    } 
    return sum; 
} 
+0

Das sieht wie ein Hausaufgabenproblem aus. Was hast du probiert? Die Komplexität ist hier polynomisch und größer als "O (n)". Übrigens macht "O (n^2 + n)" nicht viel Sinn, da asymptotisch "n^2" dominiert, also was Sie in diesem Fall schreiben möchten, ist "O (n^2)". –

+0

@William Ja, es ist eine Prüfungsfrage, auf die ich mich vorbereite. Also ist es O (n^2 + n) und ich habe recht? :) – Naomi

+0

Nun, du bist auf dem richtigen Weg, aber sehe meine Bearbeitung zu dem obigen Kommentar. –

Antwort

1

Das sieht für mich wie O(n log n) aus. Die Hauptschleife iteriert n mal, und jede Iteration benötigt log n zusätzliche Iterationen, um abzuschließen, seit j beginnt bei i und ist halbiert bis j <= 1. Wenn Sie sich die Gesamtzeit für alle Iterationen der inneren Schleife vorstellen, erhalten Sie die folgende Summe.

O(0 log n) + O(1 log(n-1)) + ... + O(n/2 log (n/2)) + ... + O((n-2) log 2) + O((n-1) log 1) = 
O(log n) + O(n log n) + O(n) = 
O(n log n)