當前位置:成語大全網 - 英語詞典 - LZW算法問題

LZW算法問題

LZW算法全名叫做Lempel-Ziv-Welch Encoding,是壹種數據壓縮算法,它是有專利的,不過現今大部分專利都己經過期。它可以對文本進行簡單的壓縮,壓縮比對於壹般場合還是可以適用的,另外使用的比較多的就是GIF圖像了。

LZW算法中有幾個比較重要的概念:字符,字符串,編碼表。它把數據流看成壹個字符序列,並將字符序列組織成壹系列的字符串,並給每個字符串壹個編碼,最後存儲的就是字符串的編碼,這樣就節省了空間。如將ababba表示為編碼1532,而1523用12bit就可以表示出來,比原來5*8bit就節省了不少空間。LZW的編碼表是動態創建的,並且通過編碼後的數據流可以恢復出與編碼時同樣的編碼表,這樣在數據存儲與傳輸的時候就不需要保存原始的編碼表,這也是與壹些在編碼之前就有固定的編碼表的算法有著巨大的區別。

1.編碼過程:

LZW是壹個固長編碼的算法的,即對於每壹個字符或字符串的編碼都是等長的。為了說明的方便,我決定用16bit作為編碼,前255作為字符編碼,256,257另作它用,這將在3中進行說明。所以字符串的編碼將從258開始。

編碼的整個過程如下:

1. 初始化編碼表,編碼起始號,並置當前字符串為空;

2. 讀入壹個字符,如果為EOF,輸出當前字符串,並結束,否則進入3;

3. 將新讀入的字符與當前字符串組成新的字符串,如果新的字符串在編碼表中出現,則繼續進行2,否則進入4;

4. 將新的字符串加入到編碼表中,分配編號,設當前字符串的長度為N,輸入新字符串的N-1長度前綴的編碼,並將當前字符串置為當前字符串的壹個長度為1的後綴,再執行2。

2.解碼過程:

對於解碼,唯壹需要知道的就是編碼的長度了,每次從編碼流中讀取相應bit的長度,就形成壹個編碼,再通過該編碼從編碼表中找出相對應的串輸出即可。由於沒有存儲編碼時對應的編碼表,在譯碼時需要同時構造編碼表。

譯碼過程如下:

1. 初始化編碼表,並置前壹個編碼為空;

2. 取壹個編碼,如果編碼為結束,則結束。否則進行3;

3. 輸出編碼所代表的字符串,如果前壹個編碼不為空,將前壹個編碼的字符串與當前字符串的第壹個字符作為新的串加入編碼表中,置前壹個編碼為當前編碼,並執行2。