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 < i
Teil. Es scheint, als würde es fast wie eine Fakultät ausgeführt, aber mit Zusatz. Alle Hinweise wäre sehr dankbar.
Antworten:
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
Sie haben also zwei verschachtelte Schleifen, jede Schleife wird mal ausgeführt, wodurch Sie eine Obergrenze von O ( n 2 ) erhalten.n O ( 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
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 / 2 n2/ 4 Ω ( n2) n2 Θ ( n2)
Wenn Sie mehr wissen möchten, lesen Sie hier .
quelle
Lassen Sie uns das nachverfolgen:
0<0 == false
).Dieser Algorithmus erhöht somit
sum
die folgende Anzahl von Malen:quelle
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
j < i
Teil also tatsächlich wärej < i^2
, wäre das resultierende O für diesen Teil n ^ 2/2?