2012-11-10 61 views
-4

規格:您將編寫一個簡單的文本壓縮和解壓縮算法,稱爲壓縮,它使用重複字符的計數來壓縮和恢復,將文本壓縮爲原始文本。數據將從文件而不是鍵盤讀入。需要用於文本壓縮/解壓縮的僞代碼

輸入:aaaaaaaaaaaaaaaaaaaAabc 輸出:a19A1a1b1c1

在你的程序中,必須有以下兩種方法。然後在main方法中調用這兩個方法來壓縮和解壓縮輸入文本。

公共靜態字符串CompressStr(字符串輸入,布爾debug_sw)

公共靜態字符串DecompressStr(字符串輸入,布爾debug_sw)

+6

http://mattgemmell.com/2008/12/08/what-have-you-嘗試/ – Jack

+1

如何:讀取文件;用「count + char」替換「字符序列」;寫入文件。 – rodrigo

回答

-1

Java有這個類的標準API中:ZIP/GZipInputStream和Zip/GZipOutputStream。如果您需要壓縮數據,請使用這些數據而不是滾動自己的數據。如果你將此作爲學習練習,最好試着閱讀Zip的算法。

+0

不是我的downvote,但是這並沒有回答這個問題:「你要寫一個簡單的文本壓縮和解壓縮算法... *,它使用重複字符的計數*」即RLE而不是LZW等 – DNA

1

那是遊程編碼算法:http://en.wikipedia.org/wiki/Run-length_encoding

Loop: count = 0 
     REPEAT 
      get next symbol 
      count = count + 1 
     UNTIL (symbol unequal to next one) 
       output symbol 
     IF count > 1 
      output count 
     GOTO Loop 

一些Python代碼:

# http://acm.zhihua-lai.com 

def runlen(s): 
    r = "" 
    l = len(s) 
    if l == 0: 
     return "" 
    if l == 1: 
     return s + "1" 
    last = s[0] 
    cnt = 1 
    i = 1 
    while i < l: 
     if s[i] == s[i - 1]: # check it is the same letter 
      cnt += 1 
     else: 
      r = r + s[i - 1] + str(cnt) # if not, store the previous data 
      cnt = 1 
     i += 1 
    r = r + s[i - 1] + str(cnt) 
    return r 

if __name__ == "__main__": 
    print runlen("aaabbccccddddd") 
    print runlen("a") 
    print runlen("") 
    print runlen("abcdefg") 
    print runlen("eeeeeaaaff")