确定这个循环问题的大 O
Determining the big-O of this loop question
我不确定这个循环的大 O 成本。谁能帮我?
我会评论我的想法。
sum = 0; // O(1)
for(i=0;i<N;i++)
for(j=0;j<i*i;j++)
for(k=0;k<j;k++) // run as 0+1²+2²+...+n²= n(n+1)(2n+1)/6
sum++; // O(1)
我的猜测是 O(N^3)。对吗?
您的 0+1²+2²+...+n²
步估计是错误的。
最里面的循环恰好运行 0+1⁴+2⁴+...+(N-1)⁴
次。这是前 n-1
个数字的四次方之和,即等于 n(n-1)(6(n-1)³+9(n-1)²+n-2)/30
.
因此总成本为O(N5).
采用另一种方法达到相同的结果。
- 外循环刚好运行N次。
- 对于每个外部迭代,中间循环最多运行
i*i
次(即最多 N2 次)。
- 对于每个中间迭代,内部循环最多运行
j
次(即最多 N2 次)。
将成本估算相乘,总成本为 O(N5)。
我不确定这个循环的大 O 成本。谁能帮我? 我会评论我的想法。
sum = 0; // O(1)
for(i=0;i<N;i++)
for(j=0;j<i*i;j++)
for(k=0;k<j;k++) // run as 0+1²+2²+...+n²= n(n+1)(2n+1)/6
sum++; // O(1)
我的猜测是 O(N^3)。对吗?
您的 0+1²+2²+...+n²
步估计是错误的。
最里面的循环恰好运行 0+1⁴+2⁴+...+(N-1)⁴
次。这是前 n-1
个数字的四次方之和,即等于 n(n-1)(6(n-1)³+9(n-1)²+n-2)/30
.
因此总成本为O(N5).
采用另一种方法达到相同的结果。
- 外循环刚好运行N次。
- 对于每个外部迭代,中间循环最多运行
i*i
次(即最多 N2 次)。 - 对于每个中间迭代,内部循环最多运行
j
次(即最多 N2 次)。
将成本估算相乘,总成本为 O(N5)。