2016-03-23 5 views
0

Ich beende eine Aufgabe für meine Klasse, dieser spezielle Abschnitt beinhaltet eine "Analyse" der Laufzeit für mehrere For-Schleifen. Der Ausbilder gab an, dass er eine Big Oh Notation-Antwort möchte.Was sind die großen O Notation für diese for-Schleifen?

ich auf dem Fundament baue die Zeit Gesamtlauf basiert auf:

1)The cost of executing each statement 
2)The frequency of execution of each statement 
3)The idea of working from "inside and out", specifically starting from inner loops. 

Ich weiß, dass:

total = 0; 

    for (int i = 0; i < n;i++){ 
    total++; 
} 

Antwort: O (N) seinen Lauf linear.

for (int i = 0; i < n;++i) 
    for (int j = 0; j < n;++j) 
    total++; 

Antwort: O (N^2), uns interessiert nur, wie groß N wächst.

ich auf

for (int i = 0;i < n;++i) 
    for (j=0;j < n * n;++j) 
    ++total; 

und

for (i = 0;i < n;++i) 
    for (j = 0; j < i;++j) 
    ++total; 

Und last but not least, ich gehe davon aus von meinem Lehrbuch, das alle Triple-verschachtelten Schleifen an N^3 Mal laufen bin verwirrt?

+4

Die erste läuft in O (n^3) und die zweite läuft in O (n^2) – Ra1nWarden

+0

Diese Schleifen sind einfach genug, um sie durch Experimente zu erhalten. Sie können verschiedene "n" -Werte (in einer Schleife) ausprobieren und die Reihenfolge ableiten. z.B. Versuchen Sie n = 10 und n = 20 und sehen Sie, was das Verhältnis der "Gesamtmenge" ist. –

+0

genauer gesagt ist der letzte '= (n * (n-1))/2 = (n^2 - n)/2 € O (n^2)' – Rocki

Antwort

4

Sie können Ihre Algorithmen Sigma-Notation, analysieren die Anzahl der Iterationen durch die innere for-Schleife Ihrer Algorithmen laufen zu zählen/erweitern:

enter image description here

Wo T_a deckt

for (i = 0; i < n; ++i) 
    for (j = 0; j < n * n; ++j) 
     ++total; 

und T_b:

for (i = 0; i < n; ++i) 
    for (j = 0; j < i; ++j) 
     ++total; 

Schließlich ist ein Hinweis auf Ihre Frage:

„Und last but not least, die ich von meinem Lehrbuch gehe davon aus, dass alle Triple-verschachtelten Schleifen in N^3 Zeit laufen“

Dies ist nicht wahr: Es hängt davon ab, wie die Iterierte sowie begrenzt erhöht wird in der Signatur jeder Schleife. Vergleiche z.B. mit der inneren Schleife in T_a oben (begrenzt durch n^2, aber einfach erhöht durch 1 in jeder Iteration) oder z.B. the algorithm analyzed in this answer, oder, für einen etwas komplizierteren Fall, the single loop analyzed in this answer.

+0

@SkyZ Glücklich zu helfen. Die Sigma-Notation ist wirklich nur ein hilfreiches Werkzeug zum Schätzen der tatsächlichen Anzahl von Iterationen eines bestimmten Algorithmus, aus dem die Zeitkomplexität natürlich folgt. – dfri

+0

Danke, dass du mir die Technik gezeigt hast, mein Professor hat nichts über Sigmas erwähnt.Woher kommt die Division durch 2 für T (B) ??? Ich bin verwirrt mit dem zweiten T_b – SkyZ

+0

@SkyZ Die Summenregel '\ sum_ {i = 1}^{n} i = n (n + 1)/2' ist [eine Standard-Summenregel] (https://de.wikipedia.org/wiki/Summation). Die verbleibenden Summen sind einfache Zählungen von "1" (oder "-1") über eine Summenindexierung; Wenn es schwierig ist, ihnen zu folgen, wird es wahrscheinlich leichter sein, sie mit Papier und Stift zu sitzen und zu versuchen, der Gleichheit durch Gleichheit zu folgen. – dfri