@savva09
Начинающий .NET-ер

Почему сложность алгоритма (n+2n+3n+…+n⋅n) = O(n³)?

Насколько я понимаю- самый простой путь для решения будет примерно такой:
n = int(input())

summ = 0

for i in range(1,n+1):
    summ += i*n


тогда количество итераций цикла будет = n.

Но почему-то правильный ответ O(n³)
  • Вопрос задан
  • 475 просмотров
Пригласить эксперта
Ответы на вопрос 3
vabka
@vabka
Токсичный шарпист
Не нужно путать big-O и алгоритм для подсчёта прогрессии.
Ответ написан
Комментировать
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Я так понял, вопрос в том, почему O(n+2n+...+n^2) = O(n^3)?

Выписывать тут алгоритм для подсчета суммы в скобках вообще бессмыслено. Его сложность никак не связана с искомой. Это как для поиска длины строки, состоящей из цифр, считать их сумму или пытаться прочитать их как число. Ну бред же.

Надо применить математику, ибо O() - это математический объект. Как вам уже сказали, надо подсчитать сумму арифметической прогрессии в скобках и получится кубический многочлен от n. Далее, по свойствам, О-большое, это будет кубическая сложность.
Ответ написан
Комментировать
@SeptiM
На всякий случай, O -- это асимптотическая оценка сверху. Что-то типа '<='. Точная оценка определяется через \Theta, а нижня оценка `>=` через \Omega.

В целом, можно посчитать точно через через прогрессию:
n + 2n + 3n + … + n ⋅ n = n ⋅ (1 + ... + n) = n * n * (n + 1) / 2 = O(n^3) (и \Theta(n^3)


Можно лениво через верхнюю оценку:
n + 2n + 3n + … + n ⋅ n <= n * n + ... n * n (n раз) = n^3 = O(n^3)

Нижняя оценка оценивается по такому же принципу:
n + 2n + 3n + … + n ⋅ n >= n/2 * n + ... n * n (n / 2 раз) >= n / 2 * n / 2 * n = \Omeg(n^3)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы