这真的取决于StringBuffer
. 假设.append()
是常数时间,很明显你有一个O(n)
算法在时间 where n = length of the words array
。如果.append
不是恒定时间,则需要将 O(n) 乘以该方法的时间复杂度。如果确实当前实现StringBuffer
逐个字符地复制字符串,那么上面的算法是
Θ(n*m)
, 或O(n*m)
, 哪里n
是字数,m
是平均字长, 你的书是错的。我假设您正在寻找一个严格的界限。
书上答案不正确的简单例子:
String[] words = ['alphabet']
根据书上的定义,n=8
,所以算法将被 64 步限制。是这样吗?显然不严格。我看到有 n 个字符的 1 个分配和 1 个复制操作,所以你得到了大约 9 个步骤。O(n*m)
如上所示,这种行为是由 的边界预测的。
我做了一些挖掘,这显然不是一个简单的角色副本。看起来内存正在被批量复制,这让我们回到O(n)
您对解决方案的第一个猜测。
/* StringBuffer is just a proxy */
public AbstractStringBuilder append(String str)
{
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
/* java.lang.String */
void getChars(char dst[], int dstBegin) {
System.arraycopy(value, offset, dst, dstBegin, count);
}
你的书要么很旧,要么很糟糕,要么两者兼而有之。我没有足够的决心去挖掘 JDK 版本来找到一个不太理想的 StringBuffer 实现,但也许存在一个。