求助:LZW译码算法的理解
红枫 2008-08-30 02:06:02 译码算法
LZW译码算法中还用到另外两个术语:①当前码字(Current code word):指当前正在处理的码字,用cW表示,用string.cW表示当前缀-符串;②先前码字(Previous code word):指先于当前码字的码字,用pW表示,用string.pW表示先前缀-符串。
LZW译码算法开始时,译码词典与编码词典相同,它包含所有可能的前缀根(roots)。LZW算法在译码过程中会记住先前码字(pW),从码字流中读当前码字(cW)之后输出当前缀-符串string.cW,然后把用string.cW的第一个字符扩展的先前缀-符串string.pW添加到词典中。
LZW译码算法的具体执行步骤如下:
步骤1: 在开始译码时词典包含所有可能的前缀根(Root)。
步骤2: cW :=码字流中的第一个码字。
步骤3: 输出当前缀-符串string.cW到码字流。
步骤4: 先前码字pW := 当前码字cW。
步骤5: 当前码字cW := 码字流中的下一个码字。
步骤6: 判断先前缀-符串string.pW是否在词典中
(1) 如果“是”,则:
① 把先前缀-符串string.pW输出到字符流。
② 当前前缀P :=先前缀-符串string.pW。
③ 当前字符C :=当前前缀-符串string.cW的第一个字符。
④ 把缀-符串P+C添加到词典。
(2) 如果“否”,则:
① 当前前缀P :=先前缀-符串string.pW。
② 当前字符C :=当前缀-符串string.cW的第一个字符。
③ 输出缀-符串P+C到字符流,然后把它添加到词典中。
步骤7: 判断码字流中是否还有码字要译
(1) 如果“是”,就返回到步骤4。
(2) 如果“否”, 结束。
[例4.7] 编码字符串如下所示,编码过程如表4-17所示。现说明如下:
(1) “步骤”栏表示编码步骤;
(2) “位置”栏表示在输入数据中的当前位置;
(3) “词典”栏表示添加到词典中的缀-符串,它的索引在括号中;
(4) “输出”栏表示码字输出。
下面为待编码的字符串
位置 1 2 3 4 5 6 7 8 9
字符 A B B A B A B A C
表4-17 LZW的编码过程
步骤 位置 词典 输出
(1) A
(2) B
(3) C
1 1 (4) AB (1)
2 2 (5) BB (2)
3 3 (6) BA (2)
4 4 (7) ABA (4)
5 6 (8) ABAC (7)
6 -- -- -- (3)
表4-18解释了译码过程。每个译码步骤译码器读一个码字,输出相应的缀-符串,并把它添加到词典中。例如,在步骤4中,先前码字(2)存储在先前码字(pW)中,当前码字(cW)是(4),当前缀-符串string.cW是输出(“A B”),先前缀-符串string.pW ("B")是用当前缀-符串string.cW ("A")的第一个字符,其结果("B A") 添加到词典中,它的索引号是(6)
表4-18 LZW的译码过程
步骤 代码 词典 输出
(1) A
(2) B
(3) C
1 (1) -- -- A
2 (2) (4) AB B
3 (2) (5) BB B
4 (4) (6) BA AB
5 (7) (7) ABA ABA
6 (3) (8) ABAC C
上面的内容参看网址:http://jpkc.ycit.cn/qhkj/jsj/dmt/1-1/ch04/tcp04040502.html?ttype=1&tcode=menu4_04040502
-----------------------------------------------------------------------------------------------
编码很好理解,但是译码有些问题:
问题一:步骤3: 输出当前缀-符串string.cW到码字流。这个码字流到底是什么?码字流不是(1)(2)(2)(4)(7)(3)吗?怎么又有个string.cW的码字流,好像在后面的步骤中没有用到。
问题二:当走到这一步:
步骤4:先前码字pW := 当前码字cW,这里到(4)。
步骤5: 当前码字cW := 码字流中的下一个码字,这里到(7)。
步骤6: 判断先前缀-符串string.pW是否在词典中
(1) 如果“是”,则:(这里结果为是)
① 把先前缀-符串string.pW输出到字符流。(输出AB到字符流)
② 当前前缀P :=先前缀-符串string.pW。(P:=AB)
③ 当前字符C :=当前前缀-符串string.cW的第一个字符。(这里怎么办?因为在字典中还没有码字(7)对应的缀-符串string.cW?真是想不明白,这步走不了,后面就没法做了)
④ 把缀-符串P+C添加到词典。