При построении символа Java String char с помощью цикла через «сложение» можно заметить, что временная сложность выполнения этой операции плохая: она квадратичная O(n^2)
раз. Тем не менее, мне интересно, если сложность пространства «добавления» строкового char-by-char через цикл также невелика.
Вот минимальный пример программы, которая выполняет построение String с помощью добавления char-by-char с синхронизацией секундомера. Результаты, которые я получил ниже, четко показывают квадратичную кривую:
/**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;
}
Хотя я могу определить временную сложность программы, мне интересно, какова пространственная сложность построения строкового типа char-by-char?
Подробный ответ, касающийся управления памятью, является предпочтительным. (Я подозреваю, что это также квадратично, потому что строки неизменяемы, и каждый раз, когда вам приходится выделять новую память для постоянно увеличивающихся строк)
Примечание: Это не дубликат Сложность конкатенации строк в C ++ и Java , поскольку она не учитывает сложность пространства . Я специально прошу подробный анализ сложности пространства анализ.