算法复杂的细节,如何处理日志案例?

时间:2018-04-09 18:02:42

标签: algorithm

我见过以下伪代码:

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

我对这最后一部分有疑问,这部分的正确数学推导是什么?

由于

2 个答案:

答案 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所示。