Algorithm Complexity
-
Hallo allerseits,
geg.:
sum = 0;
for (i = 0; i < n; i=i+2) {
for (j = 0; j < n * n; j++) {
sum++;
}
}Meine Lösung = O(N³), könnte das so hinkommen? einmal das N^1 von der ersten Schleife und das N² ( n * n ) von der zweiten...N ^ 1 + N ^ 2 = N ^3?
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wenn die ganzen Additionen als konstant gelten, dann ist das N³, ja. Aber N¹ + N² != N³. Stattdessen N¹ + N² = N². Hier hast du jedoch N¹ * N² = N³.
-
sry für den fehler, hab * gemeint
sum = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < i * i; j++) {
for (k = 0; k < j; k++) {
sum++;
}
}hab hier noch ein problem...
erste schleife = N
zweite = N²
dritte = N(N+1)/2liege ich da richtig mit 2*O(N³)=O(N³)? bin ein wenig verwirrt...
-
Deine Analyse der Einzelschleifen passt. Aber du rechnest wieder falsch zusammen. Dieses Mal stimmt zwar die Rechnung an sich (2*O(N³) ist wirklich O(N³)), aber du hast eben nicht 2*O(N³) = O(N³)+O(N³) vorliegen, sondern etwas anderes.
-
könntest du mir en Tipp geben, wie ich das am besten rechnen kann?
-
eine innere schleife geht immer multiplikativ in die Komplxität ein.
//edit ich würde als ansatz folgendes wählen:
for (i = 0; i < n; i++) for (j = 0; j < i * i; j++) for (k = 0; k < j; k++) sum++;
vereinfacht sich zu:
for (i = 0; i < n; i++) f(i)
Wenn wir die Komplexität von f kennen, können wir bestimmen, was die Gesamtlaufzeit ist. Also schauen wir uns f(i) an:
for (j = 0; j < i * i; j++) for (k = 0; k < j; k++) sum++;
vereinfacht sich zu
for (j = 0; j < i * i; j++) g(j)
und g(j) ist
for (k = 0; k < j; k++) sum++;
was offensichtlich O(j) ist.
das setzen wir in f(i) ein und sehen das j <= i^2. das heißt g(j) ist in O(i^2). Und die Schleife läuft von o bis i^2-1. Also f(i) ist O(i2*i2)=O(i^4)
zuletzt wird f(i) n mal mit Argumenten 0...n aufgerufen und erhalten somit O(n^5)
-
jetzt ist es doch verständlich, danke dir