一段简单的代码的时间复杂性

时间:2015-06-09 04:50:54

标签: java algorithm time-complexity

这是一段简单的代码。什么是时间复杂度?

for(int i=0;i<n;i++){
    String temp="";
    for(int j=i;j<n;j++){
        temp+=S.charAt(j);
    }
    System.out.println(temp);
}

N'LT; = 5000

上面的代码给了我TLE,而下一个简单的代码给了我Wrong Answer

for(int i=0;i<n;i++){
    String temp ="";
    for(int j=i;j<n;j++){

    }
    System.out.println(temp);
}

1 个答案:

答案 0 :(得分:3)

复杂性实际上是O(n^3) ,如果忽略JIT优化(并且大多数可能是在线评判关闭)。自5000^3 ~= 1.2*10^11起,预计会获得TLE。

时间复杂度的说明:

查看您的代码,并特别注意我添加的评论:

for(int i=0;i<n;i++){
    String temp="";
    for(int j=i;j<n;j++){
        temp+=S.charAt(j);
        // ^^ THIS IS NOT O(1)^^
    }
    System.out.println(temp);
}

内循环的每次迭代都需要O(|temp|)次,其中|temp|temp的长度。
回想一下,java中的String是不可变的,并且字符串连接实际上是在复制旧的基础char[]时创建一个新对象,从而导致线性时间操作。

所以,让我们检查一下temp的长度。
对于内循环的每次迭代,temp的长度增加1,并且对于外循环的每次迭代都重置。

因此,外循环的每次迭代执行的时间是某些i的内循环的所有迭代的总和,即:

Outer(n,i) = 1 + 2 + ... + n-i+1 = (n-i)(n-i+1)/2

现在,对i的所有值进行总结会得到我们:

T(n) = sum {Outer(n,i) for i = 0,...,n} 
T(n) = (n-0)(n-0+1)/2 + (n-1)(n-1+1)/2 + ... + (n-n)(n-n+1)/2
T(n) = n(n+1)(n+2)/6

last equation是平方和的变体。

我们可以看到T(n)确实在O(n^3)

使用StringBuider

可以从O(n ^ 3)到O(n ^ 2)显着改善