如何计算for的时间复杂度(int i = n - 1; i!= 0; i / = 2)?

时间:2013-09-16 18:25:49

标签: algorithm time-complexity

for (int i = n - 1; i != 0; i /= 2) ++k;

我无法理解如何计算上述时间复杂度。当n为负时,我无法弄清楚它的行为。任何人都可以帮助我到达那里。当n为正时我试过。

Statement            Code      Time 
1a                  i=n-1       1 
1b                  i != 0    log2n+1
1c                  i = i/2   log2n
2                    ++k      log 2n
Total running time       3 log 2n+2

当我分析n的代码为正时,我得到了这些值。但是当n为负时我没能得到

1 个答案:

答案 0 :(得分:4)

该算法属于O(log(n))。当abs(n - 1)是2的幂时,会出现最长的运行时间,因为在所有其他情况下,某些i /= 2步骤会导致i取值(其绝对值为)略微<由于截断,em> less 而不是abs(i / 2)

n - 1为2的幂时,某些n - 1 == 2**aa,则循环将执行a + 1次(i次为1 = 2**0次每个值2 = 2**14 = 2**2n - 1 = 2**a,...,{{1}})。也就是说,循环将执行lg(n - 1)+ 1次。

我认为你的一些困惑源于你试图考虑循环中采取了多少步骤,但请记住,这些常数因素对于渐近运行时无关紧要。为了证明运行时间是(例如)O(log(n)),您只需要显示“n的实际运行时间”/ log(n)的限制,当n接近无穷大时,小于无穷大。如果循环的每次迭代需要三步或四步,或一千步,谁在乎呢?只要实际运行时间和log(n)之间的差距由某些有限常数从上面绑定,那么它就没有区别。出于同样的原因,你不必担心对数的基数(2,或10,或e,它只是一个常数因子),或者甚至是否执行lg(n - 1)次或lg(对于任何常数m和p,n - 1 +( - )m)+( - )p次。