【发布时间】:2018-08-14 08:37:08
【问题描述】:
我正在尝试了解以下代码的空间复杂度。该代码将字符串从“aabbbb”压缩到“a2b4”。问题是Cracking the coding interview version 5 (2013)的第1章第5题,代码取自solutions
public static String compressBetter(String str) {
int size = countCompression(str);
if (size >= str.length()) {
return str;
}
StringBuffer mystr = new StringBuffer();
char last = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) == last) {
count++;
} else {
mystr.append(last);
mystr.append(count);
last = str.charAt(i);
count = 1;
}
}
mystr.append(last);
mystr.append(count);
return mystr.toString();
}
在哪里
public static int countCompression(String str) {
if (str == null || str.isEmpty()) return 0;
char last = str.charAt(0);
int size = 0;
int count = 1;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) == last) {
count++;
} else {
last = str.charAt(i);
size += 1 + String.valueOf(count).length();
count = 1;
}
}
size += 1 + String.valueOf(count).length();
return size;
}
根据作者compressBetter 有O(N) 的空间复杂度。 为什么不是 O(1)?
在countCompression 的每一次运行中,我们持有last、size 和count 以及类似的compressBetter(持有countCompression 变量加上mystr、last、count。我对空间的理解复杂度是“算法在任何时候需要/持有多少内存”。换句话说,空间复杂度与时间复杂度不同,它不是累积的。
请注意,作者在书中只考虑了人们所说的“辅助空间复杂度”(没有存储输入所需的空间),如上例所示。此外,afaik 在本书的errata 中没有关于此的条目。
更新:我的困惑来自以下示例(同一本书中的问题 1.1)
public static boolean isUniqueChars2(String str) {
boolean[] char_set = new boolean[256];
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i);
if (char_set[val]) return false;
char_set[val] = true;
}
return true;
}
尽管有 256 个布尔数组分配,但它是 O(1) - 我认为分配在计算空间复杂度时并不重要。但实际上它是 O(1),因为所需的空间是恒定的并且与输入大小无关(与 mystr Stringbuffer 不同)。
【问题讨论】:
-
您持有一个 StringBuffer,它的大小可能与 String 的大小成正比。会是这个原因吗?
标签: java string complexity-theory space-complexity