片段的运行时间是多少?

时间:2018-10-05 07:28:17

标签: java data-structures

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)

5 个答案:

答案 0 :(得分:1)

第一个代码块的复杂度为O(n^3),但是由于O(n^4)的限制,第二个代码块的复杂度为n*n

总时间为O(n^3+n^4) = O(n^4)

答案 1 :(得分:1)

这是一种通过经验证明该程序的复杂性的方法。

  • 总的复杂度取决于循环迭代的次数。

  • 每个循环迭代递增s1

  • 因此,程序结束时s1是循环迭代的次数。

所以:

  1. 在末尾添加打印语句并打印s1
  2. 将其绘制为n的函数。
  3. 计算出的曲线是C * n^2C * 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次(从0n - 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)