LZW壓縮算法

其實關於LZW的算法網上已經有不少描述了,但其實不少描述都不到位。剛開始,我看了幾篇關於LZW的博客,也沒徹底弄懂,感受挺容易,就開始寫程序實現,但結果卻老是錯的。爲此,晚上睡覺都在想錯在哪裏。次日一大早就再一次地仔細地調試程序,仍是錯,解碼的結果與原字符串不同。但仔細找緣由又總感受本身的程序邏輯沒錯。因此我逐磨着,估計是網上不少資料原本就沒說清楚。後來找到一篇稍微權威些的博客,她把原LZW的算法流程圖貼了出來,才發現解碼過程和我想象中徹底不同。並且按照流程圖進行寫代碼,程序當即變得簡潔了。不得不感慨發明LZW的那三我的的匠心獨運。html

從新貼一下算法流程圖,編碼過程:算法

clip_image002

對理解編碼有用的博客:http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.htmlapp

解碼過程:測試

clip_image003

須要特別注意的是解碼過程的流程10,我以前一直解碼出錯就是由於這裏的緣由,由於我每次都是將上次解碼的結果與本次解碼的結果相加而後添加到字典中,而實際的上次解碼結果僅與本次解碼的第一個字符相加添加到字典裏。另外,還有一點想不通的是流程五、6,爲何在解碼中若是沒有找到本次碼字時只須要把上次解碼的字串與上次字串的第一個字符相加就能夠獲得本次解碼結果了?編碼

致謝:http://blog.csdn.net/abcjennifer/article/details/7995426spa

貼上代碼:.net

編碼過程:調試

data1 = "abcaabaabababccaaaa"#測試數據
data = [i for i in data1]#數據轉換爲列表
d = {'a':0, 'b':1, 'c':2}#初始字典
STRING = data[0]#流程1
i = 1
code = []
while i!=len(data):
    CHAR  = data[i]             #流程2
    if d.has_key(STRING+CHAR):  #流程3
        STRING += CHAR          #流程7
    else:
        code.append(d[STRING])  #流程4
        d[STRING+CHAR] = len(d) #流程5
        STRING = CHAR           #流程6
    i += 1
    #while循環--                流程8
code.append(d[STRING])          #流程9
print code
print d
#編碼結果:[0, 1, 2, 0, 3, 6, 1, 7, 4, 5, 6, 0]

解碼過程:code

decode = []     #初始解碼結果
d = {0:'a', 1:'b', 2:'c'}   #初始字典
OCODE = code[0]                 #流程1
decode.append(d[OCODE])         #流程2
i = 1
while i != len(code):
    NCODE = code[i]             #流程3
    if d.has_key(NCODE):        #流程4
        STRING = d[NCODE]       #流程7
    else:
        STRING = d[OCODE]       #流程5
        STRING += CHAR          #流程6
    decode.append(STRING)       #流程8
    CHAR = STRING[0]            #流程9
    d[len(d)] = d[OCODE] + CHAR #流程10
    OCODE = NCODE               #流程11
    i += 1
    #while循環--                流程12
decode_str = ''.join(decode)
print decode_str
print decode_str == data1
print d
相關文章
相關標籤/搜索