Zadaję to pytanie, ponieważ nie jestem pewien jednego aspektu dotyczącego dużej notacji O.
Korzystam z książki Franka Carrano , Struktury danych i abstrakcje z Javą . W rozdziale „Efektywność algorytmów” pokazuje następujący algorytm:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Początkowo opisuje ten algorytm jako mający tempo wzrostu (n 2 + n) / 2 . Które patrząc na to wydaje się intuicyjne.
Stwierdzono jednak, że (n 2 + n) / 2 zachowuje się jak n 2, gdy n jest duże. W tym samym akapicie stwierdza on (n 2 + n) / 2 zachowuje się również podobnie jak n 2 / 2 . Używa go do sklasyfikowania powyższego algorytmu jako O (n 2 ) .
Uzyskać to (n = 2 + N) / 2 jest podobna do n- 2 / 2 , ponieważ Procentowo, n ma większego znaczenia. Nie rozumiem, dlaczego (n 2 + n) / 2 i n 2 są podobne, gdy n jest duże.
Na przykład, jeśli n = 1 000 000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Ten ostatni wcale nie jest podobny. W rzeczywistości jest to oczywiście dwa razy więcej niż środek. Jak więc Frank Carrano może powiedzieć, że są do siebie podobni? Ponadto, w jaki sposób algorytm jest klasyfikowany jako O (n 2 ) . Patrząc na tę wewnętrzną pętlę, powiedziałbym, że była to n 2 + n / 2
n
rozwojem zarówno funkcje „n ^ 2”, jak i twoja funkcja zachowują się podobnie, a ich tempo wzrostu jest stałe. Jeśli masz złożone wyrażenie, dominuje funkcja, która rośnie szybciej.