Я задаю этот вопрос, потому что я запутался в одном аспекте, касающемся обозначения больших О.
Я использую книгу Фрэнка Каррано « Структуры данных и абстракции с Java ». В главе «Эффективность алгоритмов» он показывает следующий алгоритм:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Первоначально он описывает этот алгоритм как имеющий скорость роста (n 2 + n) / 2 . Который смотрит на это кажется интуитивным.
Однако затем утверждается, что (n 2 + n) / 2 ведет себя как n 2, когда n большое. В том же абзаце он утверждает (п 2 + п) / 2 также ведет себя так же, как п 2 / 2 . Он использует это, чтобы классифицировать вышеупомянутый алгоритм как O (n 2 ) .
Я получаю , что (п 2 + п) / 2 аналогично п 2 / 2 , так как в процентном отношении, п имеет небольшое значение. Я не понимаю, почему (n 2 + n) / 2 и n 2 похожи, когда n большое.
Например, если n = 1 000 000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Этот последний не похож на всех. На самом деле, совершенно очевидно, что он вдвое больше среднего. Так как же Фрэнк Каррано сказать, что они похожи? Кроме того, как алгоритм классифицируется как O (n 2 ) . Глядя на этот внутренний цикл, я бы сказал, что это n 2 + n / 2
n
роста функции 'n ^ 2` и ваша функция ведут себя одинаково, что приводит к постоянной неуверенности в скорости их роста. Если у вас сложное выражение, функция, которая растет быстрее, доминирует.