译码算法
  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添加到词典。

解决方案 »

  1.   

    问题一输出的是第一个编码。问题二,你可以参考去编码ioooioo这个序列再对应解码走一遍就知道了
    你看的是一篇中文文献摘出来的算法吧,中文文献最大的本事就是把简单的东西说的很复杂很牛B
      

  2.   

    ioooioo的LZW编码结果为(1)(2)(4)(3)(2),解码还是遇到那个不能理解的问题。到(4)时从字典中不能获取当前前缀-符串string.cW,看来我实在太笨了。