Оценка кода делается в четыре шага.
- Назвать N. Длина списка, длина строки, величина числа – размер входа надо проговорить явно, иначе оценка ни о чём.
- Посмотреть на циклы и вложенность. Один цикл по всем элементам – $O(N)$, цикл в цикле – $O(N^2)$.
- Проверить, как меняется переменная цикла. Растёт на единицу – N шагов; умножается или делится на 2 – $O(\log N)$ шагов.
- Поискать скрытые циклы. Самая частая ошибка – принять короткую запись за одно действие.
nums = [4, 8, 15, 16, 23, 42]
# один цикл: N проходов
total = 0
for x in nums:
total = total + x
print(total) # 108
# два цикла подряд: N + N = 2N проходов, всё ещё O(N)
biggest = nums[0]
for x in nums:
if x > biggest:
biggest = x
count = 0
for x in nums:
if x == biggest:
count = count + 1
print(biggest, count) # 42 1
# цикл в цикле: N · N проходов, O(N²)
total = 0
for x in nums:
for y in nums:
total = total + x * y
print(total) # 11664