如何找到影响彼此的循环运行时?

时间:2017-04-26 01:37:26

标签: runtime big-o analysis big-theta

我不确定这些循环的技术术语(如果有的话),所以我将提供一个例子:

x=0
i = 1
while(i<n)
    for(j=1 to n/i)
        x = x + (i-j)
    i*=2
return(x)

在这个例子中,while循环直接改变了for循环运行的次数,这是因为某种原因让我失望

通常情况下,我会一行一行地看看每条线路的运行次数,但由于次数发生变化,我尝试进行求和,但是有点迷失了...一步一步的方法是什么解决这类问题?

笔记中的答案是O(n),但是当我这样做时,我得到了nlog(n)

感谢任何帮助,这是我最后的评论

另外,如果你知道有任何好的地方可以找到这类练习题,我将不胜感激!

谢谢

1 个答案:

答案 0 :(得分:1)

我认为对此代码的分析与此lecture中的分析非常相似,以查找构建最大堆的过程的运行时间。对它的直接分析导致了nlgn的复杂性,但是当使用求和进行分析时,结果就像你的问题一样。

回到你的问题,外循环运行enter image description here  时间和内部运行n / i。但是由于我以指数方式增长,我们可以使用另一个变量j,它在循环迭代中增加一次,因此它可以用于求和并根据关系enter image description here更改边界。

总和是 enter image description here 和是一个几何序列,其结果为enter image description here 所以当n趋于无穷大时,它会收敛到常数(2)。因此,求和被认为是一个常数因子,并且不会影响仅为O(n)的代码的渐近复杂度。