【发布时间】:2018-12-10 03:11:31
【问题描述】:
当通过“加法”循环通过一个字符一个字符地构建一个Java字符串时,可以观察到执行这个操作的时间复杂度很差:它是二次的 em> O(n^2) 时间。但是,我想知道通过循环“逐个添加”字符串的空间复杂度是否也很差。
这是一个程序的最小示例,该程序通过逐字符添加和秒表计时来执行构建字符串。下面显示的结果清楚地显示了二次曲线:
/**Create a String of n 'A's char-by-char.
* @param n Number of 'A's to be appended
* @return The finished string
*/
public static String appendString(int n) {
String str = "";
// Timed run starts here
long t = System.currentTimeMillis();
// String concatenation occurs here
for (int k = 0; k < n; k++)
str += "A";
t = System.currentTimeMillis() - t;
// Timed run ends
System.out.printf("%d\t%d\n", n, t);
return str;
}
虽然我可以得到程序的时间复杂度,但我想知道逐个字符构建字符串的空间复杂度是多少?
首选解决内存管理的详细答案。 (我怀疑它也是二次的,因为字符串是不可变的,每次你必须为不断增加的字符串分配新的内存)
注意:这不是String concatenation complexity in C++ and Java 的重复,因为它没有解决空间复杂度。我特别要求进行详细的空间复杂度分析。
【问题讨论】:
-
嗯,短期内是二次的。但是旧的未使用的字符串应该被垃圾回收,因此所需的内存空间应该只与在任何给定时间需要的字符串的大小(长度)成正比。
-
非线性时间,线性空间(内存占用)。我也不确定“平均”,但从长远来看,是的,我会这么认为。
-
一般情况下很难说。当需要优化时,我考虑过编写自己的字符串类,但到目前为止我已经能够避免它。我认为“更好的方法”取决于应用程序和使用模型。作为通用实现,String 和 StringBuilder 是很好实现的类。
-
我认为这种说法可能过于宽泛。它使我的“过早优化”传感器跳闸。以简单的方法实现代码,只应用明显的优化。然后性能测试真实运行的代码,只在需要的地方进行更多优化。如果按字符构建字符串似乎是正确的,那么使用该方法就可以了。
标签: java string complexity-theory string-concatenation space-complexity