为什么StringBuilder.append时间复杂度为O(1)

时间:2019-06-27 22:19:41

标签: java stringbuilder

通过摊销分析,我们知道使用N方法插入StringBuilder#append会花费O(N)时间。但是,这是我迷路的地方。考虑一下inputString是用户输入的字符串的情况。

for (int i = 0; i < N; i++) {
   s.append(inputString); 
   // where s is an empty StringBuilder object at the beginning 
   // and inputString is the string that is taken from the user
}

由于O(inputString.length * N)将输入字符串复制到append() StringBuilder次的末尾,这是否具有N的时间复杂度?为什么我们认为append()花费了O(1)的时间复杂性,而应将其视为O(inputString.length)

我检查的几乎所有地方都将其视为O(1),例如https://quora.com/What-is-the-complexity-of-Java-StringBuffer-appendWhat is the complexity of this simple piece of code?

1 个答案:

答案 0 :(得分:5)

  

由于append()将输入字符串复制到StringBuilder的末尾N次,这是否具有O(inputString.length * N)的时间复杂度?

是的

  

为什么我们认为append()占用O(1)的时间复杂度,而应将其视为O(inputString.length)?

附加单个字符时为O(1)。 StringBuilder就像ArrayList。当您附加单个项目时,成本为O(1)。附加字符串就像调用addAll()一样-开销与字符串的长度/要添加的项数成正比。

看来您正确理解了所有内容。问题是,人们在讨论Big-O性能时通常都很草率。这是地方性的。