wenn wir die Summe n
Zahlen mit for-Schleife for(i=1;i<=n;i++)
Komplexität davon ist O (n), aber wenn wir diese gleiche Berechnung unter Verwendung der Formel der arithmetischen/geometrischen Progression Serie n(n-1)/2
dieser Zeit, wenn wir die Zeit Komplexität berechnen, ist es O (n^2). Wie ? Bitte löse meine Zweifel.Wenn wir die Summe von n Zahlen mit For-Schleife machen ** ex.for (i = 1; i <= n; i ++) **
Antwort
Ihre zweite Formel hat O(1)
Komplexität, das heißt, es läuft in konstanter Zeit, unabhängig von n
.
Es gibt keinen Widerspruch. Die Komplexität ist ein Maß dafür, wie lange der Algorithmus zum Ausführen benötigt. Verschiedene Algorithmen können dasselbe Ergebnis mit unterschiedlichen Geschwindigkeiten berechnen.
[BTW die richtige Formel ist n*(n+1)/2
.]
Edit: Vielleicht ist Ihre Verwirrung mit einem Algorithmus zu tun hat, die n*(n+1)/2
Schritte unternimmt, die (n^2 + n)/2
Schritte ist. Wir nennen das O(n^2)
, weil es im Wesentlichen (asymptotisch) wie n^2
wächst, wenn n
groß wird. Das heißt, es wächst in der Größenordnung vonn^2
, der Term hoher Ordnung des Polynoms.
Sie sind verwirrt, was die Zahlen darstellen.
Grundsätzlich zählen wir die # Schritte, wenn wir über Komplexität sprechen.
n(n+1)/2
die Antwort der Summation ist (1..n), das ist richtig, aber unterschiedliche Art und Weise anders # nehmen von es zu berechnen, die Schritte, und wir werden die # solcher Schritte zu zählen.
Vergleichen Sie die folgenden:
int ans = 0;
for(int i=1; i<=n;i++) ans += i;
// this use n steps only
int ans2 = 0;
ans2 = n*(n+1)/2;
// this use 1 step!!
int ans3 = 0;
for(int i=1, mx = n*(n+1)/2; i<=mx; i++) ans3++;
// this takes n*(n+1)/2 step
// You were thinking the formula would look like this when translated into code!
Alle drei Antworten den gleichen Wert geben!
So können Sie nur die erste Methode siehe & die dritte Methode (was natürlich überhaupt nicht praktisch) von n
, unterschiedliche n
betroffen ist, wird sie nehmen unterschiedliche Schritte führen, während das zweite Verfahren, das die Formel verwendet, nehmen immer 1 Schritt, egal was n
Being sagte ist, wenn Sie die Formel im Voraus wissen, es ist immer das beste, was Sie berechnen nur die Antwort direkt mit der Formel
- 1. Ist etwas wie "für (i = 1; i <= 10; printf ("% d \ n "; i), i ++) gültig und UB-frei in C?
- 2. Wie ergibt sich für (int i = 5; i <= 2 * n; i ++) in der Algorithmusanalyse?
- 3. Summe (1/Primzahl [i]^2)> = 1?
- 4. Was bedeutet diese C++ Codezeile? Sol <? = F ((1 << n) -1, i, 0) + abs (P [i]) * Preis; "
- 5. Erläutern Alternative PHP for Loop-Syntax: für ($ i = 1, $ j = 0; $ i <= 10; $ j + = $ i, drucken $ i, $ i ++);
- 6. Analyse der Differenz zwischen i + = 1 und i = i + 1
- 7. was ist das Mittel von i & = (i-1) in Java
- 8. Warum ist i = i + 1 schneller als i ++?
- 9. permute i und T [i]
- 10. Können Sie mir erklären (int i = 0; i <8; i ++, Daten >> = 1)?
- 11. Expression in FOR-Befehl (for (int i = 0; i <([arr count] -1); i ++) {})
- 12. Wie können sowohl (i + 1) <ii als auch (i + 1)> ii beide wahr sein?
- 13. Summation on 1 <= i <j <k <= n in GLPK
- 14. Warum Ausführungszeit von "für ($ i = 1; $ i -le 1000000; $ i ++) {}" schneller als "für ([int] $ i = 1; $ i -le 1000000; $ i ++) {}" in Powershell
- 15. zeigen n-te: div 1, wenn i n-ten klicken: Anker
- 16. Was bedeutet diese pData [1 + 2 * i] << 8 | pData [2 + 2 * i] C++ - Syntax?
- 17. Berechnen Sie die Ableitung ([i] - [i - 1]) in Ruby
- 18. Zeitkomplexität, wenn j + = sqrt (i)
- 19. findet Gesamtzahl der (i, j) Paare in der Anordnung derart, daß i <j and a[i]> a [j]
- 20. Algorithmus zu finden, wenn es irgendein i so dass array [i] gleich i
- 21. Warum ist Math.sqrt (i * i) .floor == ich?
- 22. Unterschied zwischen (++ i) und (i ++)
- 23. Unterschied zwischen ++ i und i ++
- 24. jQuery: `: eq (i)` Auswahl
- 25. Identifizieren Sie Commits, die mit Rebase -i gequetscht wurden -i
- 26. i = i ++; ist nicht definiert. Ist i = foo (i ++) auch undefiniert?
- 27. Gegeben zwei Arrays finden den Index k, der die Summe A [i] * | B [i] -B [k] | minimiert
- 28. Return-Liste [i] = i Index einer Liste
- 29. ((i% 2 == 0) && (i% i == 0)) Diese Technik funktioniert nicht zum Generieren der Primzahl C#
- 30. Rubin - string [i] = string [i] .ord Fehler
bedeutet, dass Sie sagen, dass in der Formel (n (n + 1)/2) Entschuldigung für Minuszeichen) n wird nicht als Algorithmus-Eingabegröße betrachtet. aber beachte nur die letzte Zahl. – amit
Unterscheiden Sie die Mathematik, die das Programm berechnet, von der Mathematik, die wir verwenden, um zu analysieren, wie lange es dauert, um zu laufen. Ein Programm, das 'n' Zahlen addiert, nimmt' n' Schritte, unabhängig von den Zahlen (unter der Annahme einer Ganzzahlmathematik mit fester Breite). Das ist 'O (n)' Komplexität. Ein Programm, das jede von "n" Zahlen miteinander vergleicht, wird "n * (n + 1)/2" Schritte annehmen, was "0 (n^2)" Schritte [in der Größenordnung von n^2] seit 'ist n^2 'ist eine gute Näherung dafür, wie schnell' n * (n + 1)/2 'wächst, wenn' n 'groß ist. Siehe http://stackoverflow.com/a/487278/1682419 für ein Diagramm, das den dramatischen Unterschied zwischen Big-O-Komplexitäten zeigt. – Jerry101
ya ... es ist wahr ... übrigens danke ... für eine schnelle Antwort ... es ist jetzt klar ... – amit