【问题标题】:Calculating space complexity of string compression - Cracking the coding interview计算字符串压缩的空间复杂度——破解编码面试
【发布时间】: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 的每一次运行中,我们持有lastsizecount 以及类似的compressBetter(持有countCompression 变量加上mystrlastcount。我对空间的理解复杂度是“算法在任何时候需要/持有多少内存”。换句话说,空间复杂度与时间复杂度不同,它不是累积的。

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


【解决方案1】:

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

【讨论】:

  • 接受,因为您的评论是第一个。我的困惑实际上来自书中的另一个示例(请参阅更新),但感谢您的快速回答:)
【解决方案2】:

您询问的是compressBetter 的空间复杂度,其中包括对countCompression 的调用,但也执行了额外的工作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多