繁体   English   中英

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

[英]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每次运行中,我们都持有lastsizecount以及compressBetter相似内容(持有countCompression变量以及mystrlastcount 。我对空间复杂性的理解是“算法在任何时候需要/持有多少内存”。单词空间复杂度不同于时间复杂度不是累积的。

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM