我见过以下伪代码:
for j=1 to n
m=n
while m>0
//some instructions
m=m/2
我可以看到外环运行n次,但是当它进入while部分时它会产生一系列m / 2。例如,如果n = 10,我将大致得到m将取10,5,2,1的值,因此大约它会迭代4次;当n = 100时,m的值将是100,50,25,12,7,3,1,因此大约7次迭代。对于我所看到的将是log n(base = 2)所以最终的答案是:n * log n。我是对的吗?
我遇到的问题是如何获取while循环的详细信息,我可以这样做:
n/2=1
n=2 apply log b=2 to both sides, so I will get:
log (base 2) n=log (base 2) 2
log n=1
我对这最后一部分有疑问,这部分的正确数学推导是什么?
由于
答案 0 :(得分:1)
您可以将等式重写为两次重复除法。
所以我们希望在x
时找到n / 2^x = 1
,其中x
是我们需要预先形成的分割数量(这里我将使用1,因为在实数中算术除以2将永远不会产生零和1近似对于上限是足够好的
重新排列我们得到n = 2^x
所以现在我们拥有log(n) = x
的日志。所以x
我们需要达到1,因此内循环的时间复杂度为log(n)
答案 1 :(得分:1)
让K
表示内循环的数量。因此,2^K
大致等于n
。因此,内环的数量为K = log(2^K) = log(n)
。
要运行整个算法,需要Sum[log(n)]
个循环。这相当于log[Pi(n)] = log(n!)
。
渐近地,这是O(n log(n))
,如this SE question所示。