你如何找到相互影响的循环的运行时间?
How do you find the runtime of loops that affect eachother?
我不确定这些循环的技术术语(如果存在的话),所以我将提供一个示例:
x=0
i = 1
while(i<n)
for(j=1 to n/i)
x = x + (i-j)
i*=2
return(x)
在这个例子中,while 循环直接改变了 for 循环的次数 运行s,这让我不知何故感到困惑
一般情况下,我会逐行查看每行会出现多少次运行,但由于次数变化,我尝试求和但有点迷路...什么会是解决这类问题的循序渐进的方法吗?
笔记中的答案是O(n),但是当我这样做时我得到了nlog(n)
感谢任何帮助,这是我期末考试的复习
此外,如果您知道可以找到此类练习题的任何好地方,我将不胜感激!
谢谢
我认为对这段代码的分析与lecture中找到构建最大堆过程的运行时间的代码非常相似。对它的直接分析导致了 nlgn 的复杂性,但是当使用求和分析时,结果证明它是 n 就像你的问题一样。
所以回到你的问题,外循环运行
次和内部运行 n / i。但由于 i 呈指数增长,我们可以使用另一个变量 j,它在循环迭代中增加一次,因此它可以用于求和并根据关系 .
更改边界
总和是
求和是一个几何数列,其结果是
所以当n趋于无穷大时,它收敛于一个常数(2)。因此,总和被认为是一个常数因子,不会影响代码的渐近复杂度,它仅为 O(n)。
我不确定这些循环的技术术语(如果存在的话),所以我将提供一个示例:
x=0
i = 1
while(i<n)
for(j=1 to n/i)
x = x + (i-j)
i*=2
return(x)
在这个例子中,while 循环直接改变了 for 循环的次数 运行s,这让我不知何故感到困惑
一般情况下,我会逐行查看每行会出现多少次运行,但由于次数变化,我尝试求和但有点迷路...什么会是解决这类问题的循序渐进的方法吗?
笔记中的答案是O(n),但是当我这样做时我得到了nlog(n)
感谢任何帮助,这是我期末考试的复习
此外,如果您知道可以找到此类练习题的任何好地方,我将不胜感激!
谢谢
我认为对这段代码的分析与lecture中找到构建最大堆过程的运行时间的代码非常相似。对它的直接分析导致了 nlgn 的复杂性,但是当使用求和分析时,结果证明它是 n 就像你的问题一样。
所以回到你的问题,外循环运行
总和是