Naararouter
@Naararouter
Junior Fullstack Web Developer

Почему не совпадает сложность алгоритма?

Всем привет!
Разбираюсь с алгоритмами по Кормену, попутно пытаюсь вспоминать мат. основу из приложений к книге. И нашёл такой пример:
5ade2e4b25651630403112.png
Из вывода, по формуле, ясно-понятно, почему сложность составляет n^2. Но...ведь на практике алгоритм кодируется примерно так:
let result = 0;
for(let i = 1; i <= 3; i++){
   result += i;
}
return result;

И здесь уже сложность составляет - n. Почему? Что я упускаю?
  • Вопрос задан
  • 332 просмотра
Решения вопроса 3
Lynn
@Lynn
nginx, js, css
Тут указана не сложность, а асимптотика. Т.е. Сумма натуральных чисел при росте n растёт как n^2

https://ru.wikipedia.org/wiki/%C2%ABO%C2%BB_%D0%B1...

Так получилось, что программисты обычно сталкиваются с этими обозначениями только в контексте сложности алгоритмов, но вообще-то это обычная математическая нотация
Ответ написан
LaRN
@LaRN
Senior Developer
Сложность показывает сколько элементарных операций нужно сделать, чтобы решить задачу.
Если использовать цикл, то сложность будет порядка n операций (по числу итераций цикла), а если взять формулу суммы n первых членов арифметической прогрессии, то сложность будет не O(n*n), а порядка O(1), потому что при любом n по указанной формуле можно вычислить сумму условно за одно умножение.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Это так называемая асимптотическая сложность — сложность при n→∞.

Что никто не упомянул — так называемые символы Ландау.
a(n) = o(b(n)), (читается «о малое», «меньшего порядка чем»), если lim{n→∞}a/b = 0
a(n) = O(b(n)), (читается «о большое», «не большего порядка чем»), если a/b ограничено сверху (для дискретного n этого хватит, для непрерывного надо добавить «для какого-то n>N»).

Два символа Дональда Кнута дополняют символы Ландау.
a(n) = Ω(b(n)), если b(n) = O(a(n)). «Не меньшего порядка чем»
a(n) = Θ(b(n)), если a(n) = O(b(n)) и b(n) = O(a(n)). «Такого же порядка».

Ну а дальше идут простые пределы.
• axn + bxn−1 + … = O(cxk + dxk−1 + …), если n ≤ k;
• те же два многочлена o(·), если n < k.
• те же два многочлена Θ(·), если n = k.
Константа не важна: во-первых, при n→∞ меньшая сложность рано или поздно перевесит меньшую константу. Во-вторых, особенности реализации того или иного алгоритма на том или ином компиляторе/железе (больше/меньше команд, лучше/хуже с кэшем) эту константу могут варьировать в широких пределах;

А значит, многочлен n(n−1)/2 = n²/2 − n/2 = Θ(n²).

Да, и ещё: вы спутали асимптотический порядок самогó многочлена и асимптотическую сложность его вычисления. Первое, как я уже сказал, n². Сложность вычисления в лоб — n+const = O(n). А «не в лоб» — «за константу» , O(1).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы