2017-02-20 5 views
3

Was ist die zeitliche Komplexität für die folgende Funktion?Wie berechnet man die Zeitkomplexität für die untere Funktion?

void function(int n){ 
     for(int i=0; i<n; i++){. //n times 
      for(int j=i ; j< i*i; j++){ // n*n times 
       if(j%i == 0){ 
        for(int k=0; k<j; k++){ // j times = n * n times. 
         ++counter; 
        } 
       } 
      } 
     } 
    } 

Buch sagt O(n^5). Aber ich konnte nicht verstehen, warum Buch j%i nicht berücksichtigt hat. Die k Schleife bestimmt auf dieser Grundlage. Könntest Du das erläutern?

Antwort

1

Lasst uns den Teil des Codes betrachten, in dem u Zweifel haben:

for(int j=i ; j< i*i; j++) 
{ 
    if(j%i == 0) 
     { 
       for(int p=0; p<j; p++){ 
       ++counter; 
     } 
     } 

Lassen Sie uns diesen Teil des Codes nur analysieren. Für jeden i wird j%i==0 wahr sein, wenn j ein Vielfaches von i ist, das heißt

i, 2i, 3i, .... i*i // upto i*i only,since j<i*i 

nun für jeden j, Innen Komplexität O(j) ist.

So Komplexität für diesen Teil des Codes ist:

enter image description here

So Gesamtkomplexität = O(n*n^3) = O(n^4)

+0

Vielen Dank. Schlagen Sie vor, dass alle 3 Schleifen O (n^4) benötigen. Ich bin ein bisschen verwirrt. Kannst du das oben mit der äußeren Schleife erklären? – Manoj

+0

@Manoj Ich schreibe eine andere Antwort, um die Dinge klarzustellen. Dauert ein paar Minuten –

+0

@Manoj: Yeah für eine bestimmte ich, innere Schleifen (der Teil des Codes, den ich erwähnt habe) Komplexität ist O (i^3), und da ich von 0-n variieren, ist die Komplexität gleich O (n^4). Zumindest bekomme ich das. Kannst du das Buch erwähnen? –

1

Tatsächlich ist die Funktion in der Zeit O läuft (n^4), da die if Bedingung passiert nur einmal alle ungefähr n Schleifen. Siehe unten für genaue Analyse.

void function (int n) { 
    for(int i=0; i<n; i++) { 
     // Runs a total of n times 
     for(int j=i; j< i*i; j++) { 
      // Runs a total of (n^3 - n)/3 = O(n^3) times 
      if(j%i == 0) { 
       // Runs a total of (n^2 - n)/2 = O(n^2) times 
       for(int k=0; k<j; k++) { 
        // Runs a total of (3n^4 - 10n^3 + 9n^2 - 2n)/24 = O(n^4) times 
        ++counter; 
       } 
      } 
     } 
    } 
} 
+0

Danke, Wie hast du die Gleichung berechnet? Ich lief für n = 5. Aber (n^3 - n)/3 kommt nicht. – Manoj

+0

@Manoj Sie können eine Variante von Faulhabers Formel verwenden, um den exakten Ausdruck zu erhalten, glaube ich. Ich habe den PARI/GP-Befehl sumformal verwendet. Die Big-O-Ausdrücke sind einfacher, aber die genauen Ausdrücke zeigen, dass das, was ich habe, eng ist. – Charles

Verwandte Themen