这是一段简单的代码。什么是时间复杂度?
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);
}
答案 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)
。