Сначала l oop - это O (n), потому что это O (n / 2), и мы отбрасываем константы и члены более низкого порядка.
Второй l oop - это O (lg-n), потому что j равно 2 ^ k (то есть 2, 4, 8, 16, 32).
Третий l oop - это то, что есть j и отсчитывает, поэтому O (j). J начинается с 1 и обратите внимание, что он растет от 2 ^ k до n худшего случая. Скажем, n равно 1000. Когда j равно 500, следующая итерация будет 500 * 2 = 1000.
Сложность по времени составляет O (n + lg-n + lg-n + j) = O (n + 2lg -n + j) -> O (n + lgn + j) -> O (n) .
Мы опускаем lg-n, потому что скорость роста n при приближении n к бесконечности всегда будет опережать lg-n. Это так же, как когда мы отбрасываем n ^ 2, когда у нас есть n ^ 3, потому что последний растет со временем быстрее.
Мы опускаем j, потому что - может ли скорость роста j когда-либо опережать n, когда она зависит от n?