Algorithm 了解算法复杂性

Algorithm 了解算法复杂性,algorithm,math,time-complexity,Algorithm,Math,Time Complexity,有人能解释一下为什么bellow算法的复杂性是O(logn)? 这是来自的问题之一,他们的解释/提示我不清楚(见下面的代码块) 1。请注意,在每次迭代中,我都会从一些任意大的数字开始,比如1028:D 然后重复除以,直到降到0 每次循环顶部的i值为: 1024 512 256 128 64 32 16 8 4 2 1 0 然后向后看:你可以从i=1开始,每次乘以2,直到达到1024 因此,这是需要乘以2得到n的次数,即log2(n)添加变量ni=floor(lg2(i))。在while语句的每个

有人能解释一下为什么bellow算法的复杂性是O(logn)? 这是来自的问题之一,他们的解释/提示我不清楚(见下面的代码块)


1。请注意,在每次迭代中,我都会从一些任意大的数字开始,比如1028:D

然后重复除以,直到降到0

每次循环顶部的
i
值为:

1024 512 256 128 64 32 16 8 4 2 1 0

然后向后看:你可以从i=1开始,每次乘以2,直到达到1024


因此,这是需要乘以2得到n的次数,即log2(n)

添加变量
ni=floor(lg2(i))
。在
while
语句的每个循环中,变量
i
i
变为
i'=i/2
,因此
ni
变为
ni'
,满足以下条件:

ni' = floor(lg2(i'))
    = floor(lg2(i/2))
    = floor(lg2(i) - lg2(2))
    = floor(lg2(i) - 1)
    = floor(lg2(i)) - 1
    = ni - 1

这表明在每个循环中,
ni
减少
1
。由于
ni
floor(lg2(N))
开始,因此
中必须有
floor(lg2(N))
循环,而

整数幂运算可以定义为重复乘法。因此,按定义,乘以
1/2
k
倍等于乘以
(1/2)^k=1/2^k
ni' = floor(lg2(i'))
    = floor(lg2(i/2))
    = floor(lg2(i) - lg2(2))
    = floor(lg2(i) - 1)
    = floor(lg2(i)) - 1
    = ni - 1