簡體   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