Big O: Verschachtelt für Schleife mit Abhängigkeit

9

Ich habe eine Hausaufgabe bei Big O erhalten. Ich bin mit verschachtelten Schleifen festgefahren, die von der vorherigen Schleife abhängig sind. Hier ist eine geänderte Version meiner Hausaufgabenfrage, da ich sie wirklich verstehen möchte:

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

Der Teil, der mich abschreckt, ist der j < iTeil. Es scheint, als würde es fast wie eine Fakultät ausgeführt, aber mit Zusatz. Alle Hinweise wäre sehr dankbar.

Raphael
quelle
Schöne Erklärung hier
saadtaame

Antworten:

10

Lassen Sie mich ein paar Dinge klarstellen, Sie interessieren sich für die Big-O-Notation - dies bedeutet Obergrenze . Mit anderen Worten, es ist in Ordnung, mehr Schritte zu zählen als Sie tatsächlich tun. Insbesondere können Sie den Algorithmus auf ändern

 ...
    for (j = 0; j < n; j++) 
 ...

Sie haben also zwei verschachtelte Schleifen, jede Schleife wird mal ausgeführt, wodurch Sie eine Obergrenze von O ( n 2 ) erhalten.nÖ(n2)

Natürlich möchten Sie eine gute Schätzung für die Obergrenze haben. Zur Vervollständigung wollen wir also eine Untergrenze bestimmen. Dies bedeutet, dass es in Ordnung ist, weniger Schritte zu zählen. Betrachten Sie also die Änderung

for (i = n/2; i < n; i++)
    for (j = 0; j < n/2; j++) 
        sum++;

Hier führen wir nur einige der Schleifeniterationen durch. Auch hier haben wir zwei verschachtelte Schleifen, aber diesmal haben wir Iterationen pro Schleife, die zeigt , dass wir zumindest n 2 / 4 Additionen. In diesem Fall bezeichnen wir diese asymptotische Untergrenze mit Ω ( n 2 ) . Da die untere und obere Grenze zusammenfallen, können wir sogar sagen, dass n 2 eine enge asymptotische Grenze ist, und wir schreiben Θ ( n 2 ) .n/.2n2/.4Ω(n2)n2Θ(n2)

Wenn Sie mehr wissen möchten, lesen Sie hier .

A.Schulz
quelle
6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

Lassen Sie uns das nachverfolgen:

  • Wenn i = 0 ist, wird die innere Schleife überhaupt nicht ausgeführt ( 0<0 == false).
  • Wenn i = 1 ist, wird die innere Schleife einmal ausgeführt (für j == 0).
  • Wenn i = 2 ist, wird die innere Schleife zweimal ausgeführt. (für j == 0 und j == 1).

Dieser Algorithmus erhöht somit sumdie folgende Anzahl von Malen:

x=1nx- -1=0+1+2+3+4 ...+n- -1=n(n- -1)2

n , von denen der am schnellsten wachsende Termn2 ist,daher ist die Bachman-Landau-Big-Theta-Komplexitätθ(n2)O(n2)n2- -n2n2θ(n2)Ö(n2) einnd Ω(n2)

KeithS
quelle
3

Mal sehen, ob ich das erklären kann ...

Also, wenn die innere Schleife j war

Für die erste Iteration führen Sie nun n- (n-1) Mal durch die innere Schleife. beim zweiten mal machst du n- (n-2) mal durch die innere schleife. Beim N-ten Mal machst du n- (nn) mal durch, was n-mal ist.

Wenn Sie mitteln, wie oft Sie die innere Schleife durchlaufen, würde dies n / 2 Mal sein.

Man könnte also sagen, dies ist O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

Ist das sinnvoll?


quelle
Es ist ein bisschen komisch, aber ich denke, ich verstehe! Vielen Dank! Es könnte ein wenig dauern, bis der ganze Weg in haha
Wenn dieser j < iTeil also tatsächlich wäre j < i^2, wäre das resultierende O für diesen Teil n ^ 2/2?
Beachten Sie zunächst, dass O (n ^ 2/2) = O (n ^ 2) ist. Wenn Sie es nun in j <i ^ 2 ändern, machen Sie (n- (n-1)) ^ 2 bei der ersten Iteration und n ^ 2 bei der letzten Iteration. Ich erinnere mich nicht, wie die Big-O-Notation für die innere Schleife lauten würde. O (n ^ 2) ist eine lose Obergrenze. Eine lose Obergrenze für das Ganze wäre also O (n ^ 3), aber diese innere Schleife ist kleiner als O (n ^ 2). Ist das sinnvoll?