如何用渐近符号分析foo函数的运行时间?
我这样想:
i=0
是常数时间,n%2==0
是常数时间,n=n/2
是常数时间,i++
是常数时间。但我不能说“while
循环运行n次“。n=n/2
表达式。
我不知道这个while
循环的重复次数。例如,如果n是5,while
循环不运行,如果b是4,while
循环将跑了2次。如果b为14,while
循环仍将运行2次。
foo(n):
i=0
while(n%2==0)
n=n/2
i++
return i
答案 0 :(得分:1)
最好看Best, worst and average case。在您的问题中,最佳案例有一个恒定的时间O(1)
,最坏的情况和平均情况都有O(log(n))
时间。最好的情况是显而易见的,它是数字时的奇数。最坏的情况也很明显,当你的数字像n=2^k
时就会发生。如果您的数字类似于n=p*2^k
,其中p
为奇数,则会产生平均值。但是在这种情况下的运行时间与最坏情况类似,因为循环迭代次数因范围除以2
而下降。
您可以分析此代码,类似于Binary Search Algorithm。即使您可能在第一次比较中找到结果,但平均情况的运行时间为O(log(n))
。
此致