Ich stelle diese Frage, weil ich über einen Aspekt in Bezug auf die Big-O-Notation verwirrt bin.
Ich benutze das Buch, Datenstrukturen und Abstraktionen mit Java von Frank Carrano. Im Kapitel "Effizienz von Algorithmen" zeigt er den folgenden Algorithmus:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Er beschreibt diesen Algorithmus zunächst mit einer Wachstumsrate von (n 2 + n) / 2 . Welcher Blick darauf scheint intuitiv.
Es wird jedoch dann angegeben, dass (n 2 + n) / 2 sich wie n 2 verhält, wenn n groß ist. Im gleichen Absatz sagt er (n 2 + n) / 2 verhält sich auch ähnlich wie n 2 / 2 . Er benutzt dies, um den obigen Algorithmus als O (n 2 ) zu klassifizieren .
Ich bekomme , dass (n 2 + n) / 2 ist ähnlich wie n 2 / 2 , weil Prozentsatz klug, n macht kaum einen Unterschied. Was ich nicht verstehe, ist, warum (n 2 + n) / 2 und n 2 ähnlich sind, wenn n groß ist.
Zum Beispiel, wenn n = 1.000.000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Das letzte ist überhaupt nicht ähnlich. Tatsächlich ist es ganz offensichtlich doppelt so viel wie das mittlere. Wie kann Frank Carrano sagen, dass sie ähnlich sind? Auch, wie ist der Algorithmus wie folgt eingestuft O (n 2 ) . Wenn ich mir diese innere Schleife anschaue, würde ich sagen, dass es n 2 + n / 2 war
n
sowohl die Funktionen 'n ^ 2' als auch Ihre Funktion beim Wachsen ähnlich verhalten, da ihre Wachstumsrate konstant unterschiedlich ist. Wenn Sie einen komplexen Ausdruck haben, dominiert die schneller wachsende Funktion.