嗨,这是考试复习中的一个问题。我必须找到以下代码片段的运行时间(在Big-O中)。
sum = 0;
for( i = 0; i < n; i++ )
for( j = 0; j < i * i; j++ )
for ( k = 0; k < j; k++ )
++sum;
我认为它是O(n ^ 4)。最里面的循环执行到n,第二个执行到n ^ 2,最外面的循环执行n次。谢谢大家的帮助
答案 0 :(得分:3)
不,不是O(4)。
更好的方法是计算循环执行的次数(事实上,这就是代码正在执行的操作)。
sum(sum(sum(1,k = 0..j),j = 0..i * i),i = 0..n)
= sum(sum(j,j = 0..i * i),i = 0..n)= sum(i * i *(i * i + 1)/2,i=0..n ) 它是sum(i ^ 4,i = 0..n)的数量级,它是n ^ 5的数量级。
基本上因为中间循环是i * i并且正在为每个最内循环执行它需要计算一个额外的时间。
在C ++中
1 0
2 0
3 6
4 42
5 162
6 462
7 1092
8 2268
9 4284
10 7524
11 12474
12 19734
13 30030
14 44226
15 63336
16 88536
17 121176
18 162792
19 215118
您可以使用此表并计算有限差分(取导数),直到结果为常数或0.您将发现需要5个导数才能得到常量列表。这意味着列表的大小为n ^ 5。
例如,如果我们有一个列表,其中两个元素之间的每个差异都是常量,那么列表可以用线性函数表示。如果差异的差异是恒定的那么它将是一个四边形等等(它与低阶项无关,因为它们被衍生物/差异翻译)答案 1 :(得分:1)
正式地,使用Sigma Notation将有助于精确推断增长的顺序。
答案 2 :(得分:0)
你可以简单地思考:
In the first loop: i = n
second loop: j = i*i => j = n^2
third loop: k = j => k = n^2
So, the bigO = n * n^2 * n^2 = n^5