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.解碼過程:
對於解碼,妳唯壹需要知道的就是代碼的長度。每次從編碼流中讀取對應位的長度,就形成了壹個代碼,然後通過這個代碼就可以從編碼表中找到對應的字符串並輸出。由於沒有存儲對應的編碼表,解碼時需要同時構造編碼表。
解碼過程如下:
1.初始化碼表,將前面的代碼設置為空;
2.選擇壹個代碼,如果代碼是End,它就是End。否則,進行到3;
3.輸出代碼表示的字符串。如果前壹個代碼不為空,則將前壹個代碼的字符串和當前字符串的第壹個字符作為新字符串添加到代碼表中,將前壹個代碼設置為當前代碼,執行2。