计算字符串压缩的空间复杂度 - 破解编码访谈

时间:2018-03-06 13:08:45

标签: java string complexity-theory space-complexity

我试图了解下面一段代码的空间复杂性。该代码压缩来自" aabbbb"的字符串。到" a2b4"。问题是破解编码面试第5版(2013年)的问题5,第1章,代码取自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的每次展示中,我们都会lastsizecount以及compressBetter的相似内容(保留countCompression个变量加上mystr },lastcount。我对空间复杂性的理解是&#34;算法在任何时间需要/保持多少内存&#34;。换句话说,与时间复杂度不同的空间复杂性不是累积的

请注意,作者在书中只考虑了人们所说的&#34;辅助空间复杂性&#34; (没有存储输入所需的空间),如上例所示。此外,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不同)。

2 个答案:

答案 0 :(得分:0)

您询问的是compressBetter的空间复杂性,其中包括对countCompression的调用,但也会执行其他工作。

虽然countCompression的空间复杂度确实是O(1),但compressBetter在最坏的情况下(其中没有两个连续的字符)具有线性空间复杂度(即O(N))输入String相等),因为在这种情况下它会生成StringBuffer个2N个字符。

答案 1 :(得分:0)

只需将我以前的评论转换为答案:您持有的StringBuffer可能与String的大小成比例。只要想想你有一个没有连续重复字符的输入字符串的情况(最糟糕的情况)。