通过摊销分析,我们知道使用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-append和What is the complexity of this simple piece of code?
答案 0 :(得分:5)
由于append()将输入字符串复制到StringBuilder的末尾N次,这是否具有O(inputString.length * N)的时间复杂度?
是的
为什么我们认为append()占用O(1)的时间复杂度,而应将其视为O(inputString.length)?
附加单个字符时为O(1)。 StringBuilder就像ArrayList。当您附加单个项目时,成本为O(1)。附加字符串就像调用addAll()一样-开销与字符串的长度/要添加的项数成正比。
看来您正确理解了所有内容。问题是,人们在讨论Big-O性能时通常都很草率。这是地方性的。