以下代码段的时间复杂度是多少?

时间:2013-10-02 05:23:24

标签: java performance time runtime big-o

对于下面的代码段,估算了大写符号的时间复杂度。

for (int i=0; i< n; i++)

for (int j=0; j*j <n;j++)

for (int k=0; k < n/2;k++)
    System.out.println (i+j+k);

我认为它们是嵌套循环,但我不是100%肯定。从我可以看出,第一个循环的最差时间是O(n),第二个是O(sqrt(n)),第三个是O(log n)。那是对的吗?我是否只需乘以这些值来获得整个循环的时间复杂度?

5 个答案:

答案 0 :(得分:2)

为了扩展Krypton的评论,循环如下:

  • 循环1:O(n),如您所述
  • 循环2:O(sqrt(n))== O(n ^(1/2)),如您所述。
  • 循环3:O(n / 2),除去常数因子,是O(n)。

乘法,循环1和3一起是O(n ^ 2),并且三者一起是O(n ^(5/2))或O(n ^(2.5))。这是在二次和多项式时间之间的一些奇怪的灰色区域。

答案 1 :(得分:2)

for (int i=0; i< n; i++)  ------------------------------------
                                                             |
    for (int j=0; j*j <n;j++) ----------------------         |
                                                   |         | O(n)
        for (int k=0; k < n/2;k++)  -------        |         |
                                          |O(n/2)  |O(n^1/2) |   
            System.out.println (i+j+k); ---        |         |
                                                   |         |
                              ----------------------         |        
                                                             |
                          ------------------------------------

因此运行时

O(n)*O(n^1/2)*O(n/2) = O(n^(5/2))

答案 2 :(得分:1)

我认为O(n *(n ^(1/2))*(n / 2))。但我不确定。

答案 3 :(得分:0)

for (int i=0; i< n; i++) {               // O(n)
    for (int j=0; j*j <n;j++) {          // O(n^0.5)
        for (int k=0; k < n/2;k++) {     // O(0.5*n)
            System.out.println (i+j+k);  // O(1)
}}}

添加相同的范围语句,嵌套语句相乘

O((n)*(n^0.5)*(0.5*n)*(1)) = O(0.5*(n^2)*(n^0.5)) = O(0.5n^2.5) = O(n^2.5)

答案 4 :(得分:0)

环1的变化率线性地取决于n - >; O(n) - 线性

循环2的变化率取决于n - >的平方根。 O(n ^ 0.5) - 分数幂

环3的变化率线性地取决于n / 2,但是可以去除1/2常数 - &gt; O(n / 2) - 线性

因此,总体复杂度为O(n)* O(n ^ 0.5)* O(n)= O(n ^ 2.5)

检查以获取更多信息:http://www.brpreiss.com/books/opus5/html/page72.html