Я задаю це запитання, оскільки мене бентежить один аспект щодо великої нотації O.
Я використовую книгу, Структури даних та абстракції з 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', так і ваша функція, поводяться аналогічно, вони мають постійну різницю в швидкості їх зростання. Якщо у вас складний вираз, функція, яка росте швидше, домінує.