Результат верный, но рассуждения нет. Оператор n-=1
не будет выполнен O (n) раз, а O (logn) + O (n) фактически O (n) , не O (logn) .
Представьте n в его двоичном представлении. Тогда операция n-=1
будет выполнена столько раз, сколько в этом представлении содержится 1 бит. Оператор n/=2
будет выполняться столько раз, сколько битов в представлении, независимо от того, являются ли они 0 или 1. Это происходит потому, что 1-бит сначала будет преобразован в 0-бит с помощью n-=1
операции, а затем следующая итерация выберет тот же бит (который стал 0) для операции n/=2
, которая фактически сбрасывает этот бит.
Так что в худшем случае все значащие биты n являются 1-битными. И тогда у вас есть O (logn) выполнения операции n-=1
и O (logn) выполнения n/=2
. В общей сложности l oop составляет 2O (logn) итераций, что дает этому алгоритму O (logn) сложность времени.