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为负时我没能得到
答案 0 :(得分:4)
该算法属于O(log(n))。当abs(n - 1)
是2的幂时,会出现最长的运行时间,因为在所有其他情况下,某些i /= 2
步骤会导致i
取值(其绝对值为)略微<由于截断,em> less 而不是abs(i / 2)
。
当n - 1
为2的幂时,某些n - 1 == 2**a
为a
,则循环将执行a + 1
次(i
次为1 = 2**0
次每个值2 = 2**1
,4 = 2**2
,n - 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次。