LZW算法基於轉換串表(字典)T,將輸入字符串映射成定長(通常為12位)的碼字。在12位4096種可能的代碼中,256個代表單字符,剩下3840給出現的字符串。
LZW字典中的字符串具有前綴性,即 ωK∈T=>;ωT。
LZW算法流程:
步驟1: 開始時的詞典包含所有可能的根(Root),而當前前綴P是空的; 步驟2: 當前字符(C) :=字符流中的下壹個字符; 步驟3: 判斷綴-符串P+C是否在詞典中 (1) 如果“是”:P := P+C // (用C擴展P) ; (2) 如果“否” ① 把代表當前前綴P的碼字輸出到碼字流; ② 把綴-符串P+C添加到詞典; ③ 令P := C //(現在的P僅包含壹個字符C); 步驟4: 判斷碼字流中是否還有碼字要譯 (1) 如果“是”,就返回到步驟2; (2) 如果“否” ① 把代表當前前綴P的碼字輸出到碼字流; ② 結束。 具體解壓步驟如下:
(1)譯碼開始時Dictionary包含所有的根。
(2)讀入在編碼數據流中的第壹個碼字 cW(它表示壹個Root)。
(3)輸出String.cW到字符數據流Charstream。
(4)使pW=cW 。
(5)讀入編碼數 據流 的下壹個碼字cW 。
(6)目前在字典中有String.cW嗎?
YES:1)將String.cW輸出給字符數據流;
2)使P=String.pW;
3)使C=String.cW的第壹個字符;
4)將字符 串P+C添 加進Dictionray。
NO :1)使P=String.pW ;
2)使C=String.pW的第壹個字符;
3)將字符串P+C輸出到字符數據流並將其添加進Dictionray(現在它與cW相壹致)。
(7)在編碼數據 流中還有Codeword嗎?
YES:返回(4)繼 續進行 譯碼 。
NO:結束譯碼 。