我不确定这些循环的技术术语(如果有的话),所以我将提供一个例子:
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)
感谢任何帮助,这是我最后的评论
另外,如果你知道有任何好的地方可以找到这类练习题,我将不胜感激!
谢谢
答案 0 :(得分:1)
我认为对此代码的分析与此lecture中的分析非常相似,以查找构建最大堆的过程的运行时间。对它的直接分析导致了nlgn的复杂性,但是当使用求和进行分析时,结果就像你的问题一样。
回到你的问题,外循环运行 时间和内部运行n / i。但是由于我以指数方式增长,我们可以使用另一个变量j,它在循环迭代中增加一次,因此它可以用于求和并根据关系更改边界。
总和是 和是一个几何序列,其结果为 所以当n趋于无穷大时,它会收敛到常数(2)。因此,求和被认为是一个常数因子,并且不会影响仅为O(n)的代码的渐近复杂度。