2015-09-09 9 views
7

mit dem folgenden Codefragment ausgeführt wird:Auftrag des Wachstums als Worst-Case-Zeit als Funktion der N

int sum = 0; 
for (int i = 1; i <= N; i++) 
    for (int j = 1; j <= i*i; j++) 
     for (int k = 1; k <= j*j; k++) 
      sum++; 

Meine Vermutung:

  • Äußere Schleife: O (N)
  • Mittelschleife : O (N * N)
  • innerste Schleife: O (N * N)

Daher sollte die Gesamtlaufzeit O (N^5) sein, oder?

+0

Ist nicht die meisten inneren Schleife O (N^2 * n^2)? –

+2

Verdammt, die Antwort ist: N^7 Für einen gegebenen Wert von i wird der Körper der innersten Schleife ausgeführt 1^2 + 2^2 + 3^2 + ... + (i^2)^2 ~ 1/3 i^6 mal. Die Zusammenfassung über alle Werte von i ergibt ~ 1/21 N^7. – CodeYogi

+0

Sie haben Recht. Die Komplexität wird O (n^5) sein. – vish4071

Antwort

2

Einleitend

sum(k=1,p,k^2) = p(p+1)(2p+1)/6 = O(p^3) 
sum(k=1,p,k^6) = O(p^7) 

Computation of Komplexität

  1. Die innere Schleife aus k=1 läuft an j^2 es so tut genau j^2 Operationen.
  2. Die mittlere Schleife läuft von j=1 zu i^2 und bei jedem Schritt tun wir j^2 Operationen. Nach meiner vorläufigen Beobachtung können wir durch Einsetzen von p=i^2 in die erste Gleichung die Gesamtoperationen als i^2(i^2+1)(2*i^2+1)/6 für jeden Wert von i berechnen. Dies ist eine O((i^2)^3) = O(i^6) Anzahl von Operationen.
  3. Die äußere Schleife läuft von i=1 bis n und macht O(i^6) Operationen bei jedem Schritt. So haben wir O(n^7) Operationen.

Referenzen

+0

Scheint, das ist der richtige Weg, um die Probleme wie diese zu lösen.Auch weiß ich nicht, ob SO eine Latex-Syntax hat, es wäre viel einfacher gewesen, so zu verstehen. – CodeYogi

1

Lässt sich öffnen, wie oft jede Schleife ausgeführt wird.

First loop 1, 2, 3, 4, 5, ...., N 
Second loop 1, 4, 9, 16, 25, ...., (N*N)    // N^2 
Third loop 1, 16, 81, 256, 625, ...., ((N*N)*(N*N)) // N^4 

Also, ich denke, die Komplexität sollte N^sein 4

EDIT 1

Basierend auf einem Kommentar, ich glaube, die Komplexität Summe der Reihe sein wird

1, 16, 81, 256, 625, ...., ((N*N)*(N*N)) 

EDIT 2

Ich glaube wir haben beim Öffnen der Loops einen Fehler gemacht (Danke an CodeYogi). Versuchen wir es noch einmal.

First loop 1, 2, 3, 4, 5, ...., N 
Second loop 1, 4(1,2,3, 4), 9 (1,2,....9), 16, 25, ...., (N*N) 
Third loop 1, 30(1+4+9+16), 285(1+4+...81), and so on.......... 
+2

Ich denke, die Laufzeit sollte die Summe der Reihe sein '1 + 16 + 81 ... + (N * N) * (N * N) ', wdyt? – CodeYogi

+0

@CodeYogi Wahr, dass, editiert – Haris

+0

durch Analogie '1 + 2 + 3 ~ O (N^2)', '1 + 4 + 9 ~ O (N^3)', folglich sollte obige Lösung sein O (N^5), Recht? – CodeYogi

1

Ich denke, dass die endgültige O ist auf jeden Fall höher als O(n^4) und etwas höher als O(n^5), aber da diese Big O-Notation ist, können wir sagen, dass es O (n^5) ist. Letzte Schleife wird diese Menge an Zeit ausführen:

1 + 2^4 + 3^4 + 4^4 + ... + n^4 

Wolframalpha stellt es als:

enter image description here

Bitte beachten Sie erweiterte Version für n>0:

enter image description here

Edit:

Ich habe gerade festgestellt, dass es eine Lücke in meiner Antwort gibt, denn die meisten inneren Schleifen werden öfter ausgeführt als ich angenommen habe. Betrachtet man die Ergebnisse dieser dreifachen Schleife und zeichnet sie auf, scheint es höher zu sein als O(n^6). Ich werde darauf zurückkommen.

Bearbeiten 2: Wie ich schon sagte, lag ich falsch. Kann es nicht besser erklären als @fjardon in seinem answer.

+0

Ah, Sie haben Recht. Ich arbeite auch daran – CodeYogi