Эти циклы выполняются каждый раз за время O (log n). Вы можете сделать еще более жесткое утверждение для первого и сказать, что оно выполняется за время O (b), где b - количество битов, установленных в числе. Случается, что b = O (log n), потому что число n требует O (log n) битов для записи.
Говорить о времени выполнения алгоритмов, обрабатывающих числа, всегда немного рискованно по одному, потому что у вас есть две вещи в напряжении друг с другом. Одним из них является то, что в математическом смысле число бит в числе растет логарифмически с величиной числа. То есть количество битов в числе n равно O (log n). С другой стороны, на реальных машинах существует фиксированное ограничение на число бит в числе, из-за чего время выполнения «должно» быть константой, поскольку вы не можете иметь неограниченно большие значения n.
Одна ментальная модель, которую я нахожу здесь полезной, состоит в том, чтобы подумать о том, что на самом деле означало бы неограниченный рост n. Если у вас есть 45-битное число, я предполагаю, что вы либо
- работаете в 64-битной системе, либо
- работаете в 32-битной системе и используете несколько 32-разрядных целых чисел для сборки вашего 45-разрядного числа.
Если мы сделаем предположение (1), то мы неявно говорим, что по мере того, как наши числа становятся все больше и больше, мы движемся к большему и большие машины размера слова. (Это может быть формализовано как модель трандихотомной машины ). Если мы сделаем предположение (2), то мы предполагаем, что наши числа не обязательно вписываются в машинное слово, и в этом случае число битов не является константой. Для этого нужно ввести другой параметр w, указывающий размер машинного слова, а затем выполнить анализ в терминах w. Например, мы можем сказать, что время выполнения обоих алгоритмов равно O (w). Это устраняет зависимость от n, что может переоценить проделанную работу.
Надеюсь, это поможет!