我知道算法 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})$?
答案 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缩放。