我给出了算法的伪代码:
1 for i=1 to n //n times
2 j=2^i //n times
3 while j>=2 //2+3+....? times
4 j=j/2 //1+2+....? times
'到'意味着小于或等于,以及' ^'意味着权力。
我非常确定前两行是否运行n次,但是我不太确定如何计算其他两行。
我知道第3行的前两个值是2 ......然后是3,但我不确定接下来要做什么。
与第4行相同,前两个值为1 ..然后是2,但后来我不知道如何继续。
我告诉他答案是O(n^2)
,我必须将所有行加在一起才能获得实际结果。
有什么想法吗?
答案 0 :(得分:1)
内部循环将运行log2(j)
次,因为j
每次迭代减半。虽然j
是2^i
,但是log2(j) = i
。即内循环运行i
次。正如i
从1
到n
所做的那样,总迭代次数为1+2+3+4+..+n
,而它是一个简单的算术系列,其总和为(n+1)n/2
,其中如上所述O(n^2)
。
(注意:我可能在某个地方错过了一些+/- 1常数,但它不会影响产生的复杂性。)
答案 1 :(得分:1)
让我们首先假装每个算术运算花费相同的时间。在这种情况下,请查看此代码的作用:
2 j=2^i //n times
3 while j>=2 //2+3+....? times
4 j=j/2 //1+2+....? times
如果你考虑loop(3)如何执行,它会在每次迭代时将j除以2。如果你认为j是2的幂,它会在每次迭代时将指数减少1。这只能在j下降到2之前发生O(i)次。因此,该部分代码在时间O(i)中运行,假设所有算术运算花费相同的时间。
外环将运行n次,因此这里完成的工作将与1 + 2 + 3 + 4 + ... + n =Θ(n 2 )成比例。
问题在于所有算术运算花费相同时间的假设并不现实。数字2 n 增长非常快,并且会快速溢出任何固定宽度的整数类型。这里时间界限的更现实的假设是每个操作将花费与数字中的位数成比例的时间。我将忽略这个案例,因为我怀疑这是一个课堂作业,但值得记住这一点。
答案 2 :(得分:0)
将其分解为更小的步骤
3 while j>=2 //2+3+....? times
4 j=j/2 //1+2+....? times
某些j = N的上述循环运行~log(N)次
由于i从1变化到N,j从2 ^ 1到2 ^ N变化。 每个while循环现在执行~log(2 ^ i)次,等于~i次
希望这有帮助