我是复杂性分析的新手。任务是给出非空字符串,例如" Code"返回一个字符串,如" CCoCodCode"。我有这两个程序正在做同样的事情。
计划1:
public String stringSplosion(String str) {
String result = "";
for (int i=0; i<str.length(); i++) {
for(int j=0;j<=i;j++)
result += str.charAt(j);
}
return result;
}
所以,上面的一个很简单,这个程序有 O(n ^ 2)的复杂性。
计划2:
public String stringSplosion(String str) {
String result = "";
// On each iteration, add the substring of the chars 0..i
for (int i=0; i<str.length(); i++) {
result = result + str.substring(0, i+1);
}
return result;
}
从另一个StackOverflow问题来看,似乎str.substring()
的时间复杂度为 O(n)。在这种情况下,程序2也具有 O(n ^ 2)时间复杂度。
我的分析是正确的还是我错过了什么?
答案 0 :(得分:6)
事实上,两者都具有相同的复杂性 - O(n^3)
。那是因为你使用+=
来连接答案!那里有一个你没有考虑的隐藏循环,以及Schlemiel the Painter's Algorithm的典型例子。您应该使用StringBuilder
代替,这是构建字符串的正确方法。
答案 1 :(得分:0)
原谅缩进,但这实际上是一种满足测试的解决方案。
public String stringSplosion(String str) {
// Empty String test
if (str.length() == 0)
return str;
StringBuilder sb = new StringBuilder();
for (int i=0; i<=str.length() ; i++) {
sb.append(str.substring(0,i));
}
return sb.toString();
}