这2个程序的时间复杂度

时间:2017-12-11 14:57:43

标签: java string algorithm time-complexity

我是复杂性分析的新手。任务是给出非空字符串,例如" 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)时间复杂度。

我的分析是正确的还是我错过了什么?

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();
   }