![](/img/trans.png)
[英]Why is the time complexity of this example from “Cracking the Coding Interview” O(k c^k)?
[英]Calculating space complexity of string compression - Cracking the coding interview
我试图理解以下代码的空间复杂性。 该代码将字符串从“ aabbbb”压缩为“ a2b4”。 问题是来自《破解编程访谈》第5版(2013)的问题5,第1章,并且代码来自解决方案
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在此书的勘误表中也没有条目。
更新:我的困惑源于以下示例(同一本书中的问题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不同)。
您正在询问compressBetter
的空间复杂性,其中包括对countCompression
的调用,但还会执行其他工作。
尽管countCompression
的空间复杂度确实为O(1)
,但在最坏的情况下(其中输入String
两个连续字符都不相等), compressBetter
具有线性空间复杂度(即O(N)
),因为它会产生2N的StringBuffer
在这种情况下的字符。
只是将我之前的评论转换为答案:您所持有的StringBuffer
的大小可能与String的大小成比例。 请考虑以下情况(最坏的情况):输入字符串没有连续的重复字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.