这个字符串连接实现真的是O(n ^ 2)吗?

时间:2013-08-25 17:22:25

标签: java algorithm complexity-theory

我正在阅读一本关于算法问题的热门书籍,并看到了字符串连接的实现,如下所示:

public String joinTheStrings(String[] theStrings){
     String joinedString = "";
     for(String singleString : theStrings){
          joinedString = joinedString + singleString;
     }
     return joinedString;
}

然后,作者继续声称此实施是O(n^2),并且优化将使用StringBuffer代替joinedString,他们声称这将使算法成为O(n) { {1}}。但是,我没看到原始算法是O(n^2) - 在我看来,对于N个单词,将有N个操作(将字符串加在一起)。

  

更新:感谢您的回复。看起来我很困惑作者如何处理复制一个字符数组(我认为这是一个常量)作为摊销运行时N的另一个因素?

1 个答案:

答案 0 :(得分:3)

+运算符用于通过在大小为String的新char[]中复制其两个操作数的字符来创建新的firstString.length() + secondString.length(),但为此必须迭代超过他们两个人的角色。这就是你隐藏的内环所在。

但是,最新版本的JDK在编译时通过自动将其转换为StringBuilder的{​​{1}}操作来优化字符串连接。你提到的那本书必须很旧,现在append()一般都没用,因为它是同步的。

无论如何,编译器可能不够智能,无法在循环外部提取<{1}}实例化,为每次迭代创建新的字符串构建器,从而降低其作为性能优化的实用性。因此,手写这个并不是一个坏主意:

StringBuffer