我正在关注一个在线课程,我无法理解如何估算算法的增长顺序这里的例子
以下代码片段的最坏情况运行时间的增长顺序是多少? 作为N?
的函数 Int sum = 0;
For (int i = 1; i <= 4*N; i = i*4)
for (int j = 0; j < i; j++)
sum++;
任何人都可以向我解释如何获得它
答案 0 :(得分:3)
只计算语句sum++;
的执行次数。
= 1 + 4 + 16 + 64 ... + 4 * N
这是几何级数,公因子为4.如果此系列中的术语数为k,则
4^k = 4*N.
Sum of series = (4^k - 1)(4-1) = (4*N - 1)/3.
为了增长,我们忽略了常数因素。
因此复杂性为O(N)。
答案 1 :(得分:1)
这非常简单:
外循环有log(N) + 1
次迭代(对数为4)。
设x
为外循环迭代次数。内循环迭代4^x
次。
因此,总运行时为Sum(4 ^ x) for x in [0..c]
,其中c
为log(N)
这是geometric series,它的总和可以使用wiki中的公式轻松计算:
Sum(4 ^ x) for x in [1..c]
= (1 - 4^c)/(1 - 4)
= (4 ^ c)/3
。现在c
是基数4中的log(N),因此4^c = N
。因此总答案是N,有一些常数因素。
答案 2 :(得分:1)
在找到算法的顺序时,我们找到算法经历的步骤总数
这里最里面的循环的步数等于i的当前值。
让我通过
中的值i1,i2,i3 ......因此,算法中的步骤总数为 - &gt;&gt; i1 + i2 + i3 + ... in。
这里i1,i2,i3 ......的值是1,4,64 ... 4N;这是GP,第一项= a = 1和最后一项 等于4N。因此,该算法的复杂性是本GP中所有术语的总和。
SUM = 1 + 4 + 64 + ... 4N
GP的总和n项a,ar,ar ^ 2 ... ar ^(n-1)= a((r ^ n)-1)/(r-1)= a(L * r- 1)/(R-1) 其中L =最后一个词;
这里我们的例子中sum = 1 *((4 * 4N)-1)/ 3 这是上一学期L的约1.33倍 SUM = 1.33 * 4N 这是N的线性顺序
因此,步数是N和N的线性函数 因此算法的复杂度为N阶;即O(n)。