求助: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添加到词典。
...全文
305 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
silver9887 2010-07-01
  • 打赏
  • 举报
回复
我明白了!!!!!!!!!!!!!!!
发了个消息给你,如果你还在的话,看一下你的消息,就明白了
silver9886 2010-06-30
  • 打赏
  • 举报
回复
楼上讲的不知道什么意思,讲了等于没讲!
讲:译码做到第五步时,Cw=(7),没在词典中,此时当前前缀p= string.pW=AB,当前字符C= string.pW中的第一个字符=A,所以把P+C=ABA加到词典中形成码字(7),同时输出。
还讲错啦,C= string.cW!!!!!!!!!!!!!!!!!!!!!!!!!!!
兄弟,我和你一样,这个问题你的两个问题我也想不通!!!!!!!!!!!!!
silver9886@126.com 你要是还看到这个帖子的话,信箱联系BA!大家共同进步!!!我也是学的不会!
nyfib 2010-06-07
  • 打赏
  • 举报
回复
回答问题1:
cW 是码字,如(1)、(2)……(7)等,而string.cW则是指对应的缀串,如A、B、C、……、ABA分别对应码字(1)、(2)……(7)
回答问题2 :
译码做到第四步时,Cw=(4),在词典里故可输出串AB(string.cW=AB),则当前前缀=string.pW=B,当前字符C= string.cW的第一个字符=A,故把P+C=BA加到词典中形成码字(6):
译码做到第五步时,Cw=(7),没在词典中,此时当前前缀p= string.pW=AB,当前字符C= string.pW中的第一个字符=A,所以把P+C=ABA加到词典中形成码字(7),同时输出。
总结下:
要弄清楚cW与pW每次迭代是什么,注意 “步骤4: 先前码字pW := 当前码字cW。”,再按照步骤一步一步来就ok了……希望能看懂啊
wuyi8808 2008-10-20
  • 打赏
  • 举报
回复
oo
oo 2008-10-19
  • 打赏
  • 举报
回复
up

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧