sqrt系列的算法复杂度

时间:2017-05-11 03:14:09

标签: algorithm asymptotic-complexity

在以下算法中:

for i=1 to n
    for j=1 to sqrt(i)
        //some code here

这会是它的复杂性吗?

我得到的是j的以下系列值: 1,1,1,2,2,2,2,2,2,3,3,3,3,3 ....

所以当我从1变为3时,j只会执行1次 当我从4变为8时,j将仅执行2次

最后我收到了以下总结:

pow(1,0.5)+pow(2,0.5)+pow(3,0.5)...

所以我认为这大约小于O(n ^ 2)

那会是对的吗?

由于

2 个答案:

答案 0 :(得分:3)

你的求和是正确的,但问题比那更容易:

运行时间是 O(n ^ 1.5),即 O(n * sqrt(n)),你知道这是因为代码在内循环小于 n * sqrt(n)次。

此外,你知道绑定是紧的,因为内部循环中的代码运行超过 n / 2 * sqrt(n / 2)次{{1从in/2 n / 2 * sqrt(n / 2) = n * sqrt(n)/(2 * sqrt( 2))

答案 1 :(得分:1)

你在问题​​中说的话似乎是在正确的轨道上。内循环的执行次数是f(n)= sqrt(1)+ sqrt(2)+ ... + sqrt(n)。我们可以证明这是Theta(n sqrt(n))。首先,通过选择c = 1,很明显f是O(n sqrt(n))。对于另一个方向,请注意sqrt(a)+ sqrt(b)> sqrt(a + b)为正a,b;然后,配对求和sqrt(1)+ sqrt(n)>的元素。 sqrt(1 + n),sqrt(2)+ sqrt(n-1)> sqrt(n + 1),依此类推;所以当n是偶数时,求和大于(n / 2)sqrt(n + 1)。因此,选择c = 2或左右应该适用于这个方向:总和的两倍,或奇数n的左右,应该总是大于n sqrt(n)。