for (int i = 0; i < n; i++)
for (int j = i; j <= n; j++)
for (int k = i; k <= j; k++)
s1++;
for (int q = 0; q < n * n; q++ )
for(int p = 0; p < q; p++)
s1++;
这是两个o(n ^ 3),所以它是o(n ^ 6)对吗?我正在运行程序,好像是o(n ^ 5)
答案 0 :(得分:1)
第一个代码块的复杂度为O(n^3)
,但是由于O(n^4)
的限制,第二个代码块的复杂度为n*n
。
总时间为O(n^3+n^4) = O(n^4)
答案 1 :(得分:1)
这是一种通过经验证明该程序的复杂性的方法。
总的复杂度取决于循环迭代的次数。
每个循环迭代递增s1
。
因此,程序结束时s1
的值是循环迭代的次数。
所以:
s1
。n
的函数。C * n^2
,C * n^3
或其他任何曲线的拟合,随着n
变大。如果您想证明复杂性,请对其进行分析,然后通过归纳法做一些代数/证明,以得出s1
的值作为{{1的函数}的解析公式 }}。然后根据解析公式确定复杂度等级。
提示:如果公式是度为n
的{{1}}中的多项式,则复杂度类别将为n
。
测量时间可能会给您造成误导的结果,因为有多种因素会扭曲时间,包括JVM预热效果。
打印p
的值没有问题。
答案 2 :(得分:0)
每个循环都是O(n^3)
,有两个循环一个接一个地执行,因此总体复杂度为O(2*n^3)
,与 O(n^3)
相同
此
for (int i = 0; i < n; i++)
for (int j = i; j <= n; j++)
for (int k = i; k <= j; k++)
for (int q = 0; q < n * n; q++)
for (int p = 0; p < q; p++)
s1++;
将是O(n^6)
。
答案 3 :(得分:0)
以上代码片段的总体复杂度将为O(n ^ 3)+ O(n ^ 4)= O(n ^ 4)[Big-O表示法的最坏情况复杂度]。
答案 4 :(得分:0)
您的第一个for
循环迭代n
次(从0
到n - 1
),因此时间复杂度为 O(n)(忽略常量值)。
第二个也迭代n
次,但它在第一个循环的每次迭代中都执行。
到目前为止,总共 O(n * n)。
然后,最里面的for
循环迭代j
次,在最坏的情况下等于n
,因此迭代n
次,这使得第一个嵌套循环块时间复杂度为 O(n * n * n)= O(n ^ 3)。
以下块是单独的块。时间复杂度不会与第一个相乘,而是会添加。
由于对q < n * n
进行迭代,因此其第一个循环的复杂度为 O(n * n)。对于其每次迭代,都会执行内部循环并运行q
次,在最坏的情况下(最后一次, O(n * n-1)= O(n * n))迭代)。
如果我的计算是正确的(我真的不知道,请仔细阅读并建议修改),那么代码的时间复杂度为
O(n ^ 3)+ O(n ^ 2 * n ^ 2)= O(n ^ 3)+ O(n ^ 4)= O(n ^ 4) >