派生一个while循环在$ \ Theta(\ sqrt {n})$中运行

时间:2019-09-29 17:29:43

标签: python time-complexity complexity-theory

我知道算法 A 在$ \ Theta(\ sqrt {n})$中运行,但是如何得出这一事实呢?

算法 A

i = 0
s = 0
while s <= n:
    s += i
    i += 1

这就是我的想法。我们知道 A 的上限是O(n),因为我们在每次迭代中将$ s $递增1以上。我们也知道,它必须以$ \ log n $为下界,因为我们在每次迭代中以$ 2 ^ i $以下的增量增加$ s $。 (如果我错了,请纠正我,这些只是我的想法...)。

现在,关于 A ,我们还能说些什么?我们如何得出其时间复杂度为$ \ Theta(\ sqrt {n})$?

3 个答案:

答案 0 :(得分:2)

为帮助您进行推理,您可以进行实验性测试来计算迭代次数。例如:

for n in range(100000000, 1000000000, 100000000) :   
    i = 0
    s = 0
    while s <= n:
        s += i
        i += 1

并获得以下结果:

    n       | iterations|   sqrt(n)
-------------------------------------
100000000   |   14143   |   10000.00
200000000   |   20001   |   14142.14
300000000   |   24496   |   17320.51
400000000   |   28285   |   20000.00
500000000   |   31624   |   22360.68
600000000   |   34642   |   24494.90
700000000   |   37418   |   26457.51
800000000   |   40001   |   28284.27
900000000   |   42427   |   30000.00

编辑

如@WillNess所建议,您可以here

了解更多信息

答案 1 :(得分:1)

从代码s = 1 + 2 + 3 + .... + i(1)和s <= n(2)中可以看到。第一个等式也可以写为s = i * (i + 1) / 2,这意味着i中的sqrt(s * 2)sqrt(n * 2)近似,并且如我们从代码中看到的while循环运行i次,每次都进行O(1)计算。因此,总体复杂度为O(sqrt(n))

答案 2 :(得分:1)

每次增加i时,我们就将s添加到i中。因此,这意味着经过k个步骤之后,s已增长为:

     k
    ---
    \
s = /   i
    ---
    i=0

此序列是已知的。在 k 步骤之后,有 T k 个数字,其中 T k triangular number [wiki] T k 的较短公式是 T k = i×(i + 1)/ 2 。因此 T k k 缩放二次

T k 高于 n 时,该过程将停止。因此,我们可以确定: T k > n ,从而确定 k×(k + 1)/ 2> T k < / em>,因此 k 2 / 2 + k / 2-n> 0 。这是一个二次方程,判别式 d = 1/4 + 2×n ,因此作为(正)解 k 0 =-1/2 + √d。因此,它以√2n缩放。