vldmrmlkv
@vldmrmlkv
experienced internet user

Какая сложность у этого алгоритма?

Прохожу курс по алгоритмам, есть задача где нужно оценить сложность, есть объяснение автора, но я не до конца понимаю и мне кажется здесь есть ошибка..

Задача:
Рассмотрим следующую функцию, которая считает сумму цифр всех чисел в массиве. Пусть a – массив размера
N, а элементы этого массива – целые неотрицательные числа, не больше С. Дайте наиболее точную оценку асимптотики времени работы этой функции.

Код:
def count_digit_sum(N, a):
    sum = 0
    for i in range(N):
        value = a[i]
        while value > 0:
            sum += value % 10
            value //= 10
    return sum


Оценка сложности данного кода - O(N*log C), а мне кажется что O(N*C).

Объяснение автора:

Оценим сначала асимптотику времени работы внутреннего цикла while: того, который считает сумму цифр одного числа.

На каждой итерации этого цикла значение value уменьшается хотя бы в 10 раз (значение может уменьшиться чуть сильнее, чем в 10 раз, из-за округления при целочисленном делении). Значит, если прошло k итераций цикла, то значение value уменьшится хотя бы в 10^k раз. Так как исходно значение не превышало C, получаем, что 10^k <= C, значит k <= logC. Таким образом, асимптотика времени работы внутреннего цикла while составляет O(log C)
Так как этот цикл независимо запускается N раз, итоговая асимптотика времени работы программы составляет
O(N⋅logC).


Я не понимаю почему O(N*logC), а не O(N*C). Цикл while же выполняется пропорционально количеству цифр в числе..
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Цикл while же выполняется пропорционально количеству цифр в числе..
Да. А количество цифр в числе C это ⌊log10C⌋ + 1.
Элемент суммы с меньшей степенью (1) отбрасываем, округление вниз убираем, основание логарифма неважно, получаем logC
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Changellenge >> Москва
от 255 000 до 490 000 ₽
Changellenge >> Москва
от 255 000 до 490 000 ₽
19 сент. 2024, в 10:10
300 руб./в час
19 сент. 2024, в 10:05
2000 руб./в час