60楼#
发布于:2003-01-25 09:21
步骤4: 判断码字流中是否还有码字要译
(1) 如果“是”,就返回到步骤2; (2) 如果“否” ① 把代表当前前缀P的码字输出到码字流; ② 结束。 |
|
|
61楼#
发布于:2003-01-25 09:22
LZW编码算法可用伪码表示。开始时假设编码词典包含若干个已经定义的单个码字,例如256个字符的码字,用伪码可以表示成:
-------------------------------------------------------------------- Dictionary[j] ← all n single-character, j=1, 2, …,n j ← n+1 Prefix ← read first Character in Charstream while((C ← next Character)!=NULL) Begin If Prefix.C is in Dictionary Prefix ← Prefix.C else Codestream ← cW for Prefix Dictionary[j] ← Prefix.C j ← n+1 Prefix ← C end Codestream ← cW for Prefix -------------------------------------------------------------------- |
|
|
62楼#
发布于:2003-01-25 09:22
(2) 译码算法
LZW译码算法中还用到另外两个术语:①当前码字(Current code word):指当前正在处理的码字,用cW表示,用string.cW表示当前缀-符串;②先前码字(Previous code word):指先于当前码字的码字,用pW表示,用string.pW表示先前缀-符串。 LZW译码算法开始时,译码词典与编码词典相同,它包含所有可能的前缀根(roots)。LZW算法在译码过程中会记住先前码字(pW),从码字流中读当前码字(cW)之后输出当前缀-符串string.cW,然后把用string.cW的第一个字符扩展的先前缀-符串string.pW添加到词典中。 |
|
|
63楼#
发布于:2003-01-25 09:22
LZW译码算法的具体执行步骤如下:
步骤1: 在开始译码时词典包含所有可能的前缀根(Root); 步骤2: cW :=码字流中的第一个码字; 步骤3: 输出当前缀-符串string.cW到码字流; 步骤4: 先前码字pW:= 当前码字cW; 步骤5: 当前码字cW := 码字流中的下一个码字; |
|
|
64楼#
发布于:2003-01-25 09:23
步骤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) 如果“否”, 结束。 |
|
|
65楼#
发布于:2003-01-25 09:24
LZW译码算法可用伪码表示如下:
---------------------------------------------------------------- Dictionary[j] ← all n single-character, j=1, 2, …,n j ← n+1 cW ← first code from Codestream Charstream ← Dictionary[cW] pW ← cW While((cW ← next Code word)!=NULL) Begin If cW is in Dictionary Charstream ← Dictionary[cW] Prefix ← Dictionary[pW] cW ← first Character of Dictionary[cW] Dictionary[j] ← Prefix.cW j ← n+1 pW ← cW else Prefix ← Dictionary[pW] cW ← first Character of Prefix Charstream ← Prefix.cW Dictionary[j] ← Prefix.C pW ← cW j ← n+1 end ---------------------------------------------------------------- |
|
|
66楼#
发布于:2003-01-25 09:24
例:编码字符串如表4-16所示,编码过程如表4-17所示。现说明如下:
“步骤”栏表示编码步骤; “位置”栏表示在输入数据中的当前位置; “词典”栏表示添加到词典中的缀-符串,它的索引在括号中; “输出”栏表示码字输出。 |
|
|
67楼#
发布于:2003-01-25 09:24
表4-16 被编码的字符串
位置 1 2 3 4 5 6 7 8 9 字符 A B B A B A B A C |
|
|
68楼#
发布于:2003-01-25 09:25
表4-17 LZW的编码过程
步骤 位置 词典 输出 (1) A (2) B (3) C 1 1 (4) A B (1) 2 2 (5) B B (2) 3 3 (6) B A (2) 4 4 (7) A B A (4) 5 6 (8) A B A C (7) 6 -- -- -- (3) |
|
|
69楼#
发布于:2003-01-25 09:25
表4-18解释了译码过程。每个译码步骤译码器读一个码字,输出相应的缀-符串,并把它添加到词典中。例如,在步骤4中,先前码字(2)存储在先前码字(pW)中,当前码字(cW)是(4),当前缀-符串string.cW是输出(“A B”),先前缀-符串string.pW (\"B\")是用当前缀-符串string.cW (\"A\")的第一个字符,其结果(\"B A\") 添加到词典中,它的索引号是(6)
|
|
|
70楼#
发布于:2003-01-25 09:25
表4-18 LZW的译码过程
步骤 代码 词典 输出 (1) A (2) B (3) C 1 (1) -- -- A 2 (2) (4) A B B 3 (2) (5) B B B 4 (4) (6) B A A B 5 (7) (7) A B A A B A 6 (3) (8) A B A C C |
|
|
71楼#
发布于:2003-01-25 09:26
LZW算法得到普遍采用,它的速度比使用LZ77算法的速度快,因为它不需要执行那么多的缀-符串比较操作。对LZW算法进一步的改进是增加可变的码字长度,以及在词典中删除老的缀-符串。在GIF图象格式和UNIX的压缩程序中已经采用了这些改进措施之后的LZW算法。
LZW算法取得了专利,专利权的所有者是美国的一个大型计算机公司―Unisys(优利系统公司),除了商业软件生产公司之外,可以免费使用LZW算 (全文完) |
|
|
72楼#
发布于:2003-01-25 09:28
这里是全文,有兴趣的可以直接下载。
|
|
|
73楼#
发布于:2003-01-25 09:30
还有吗?我快放假了,放假就不能上了 :(应你的要求,已将后面的及全文全部放了上来,希望能对你有用。 |
|
|
74楼#
发布于:2003-01-25 09:42
文章中的图没有!如果是本书,可否将整书都放上来! :P
|
|
|
75楼#
发布于:2003-01-25 09:44
文章中的图没有!如果是本书,可否将整书都放上来! :P我这儿也没图,不好意思。 |
|
|
76楼#
发布于:2003-01-25 11:35
[quote]还有吗?我快放假了,放假就不能上了 :(应你的要求,已将后面的及全文全部放了上来,希望能对你有用。 [/quote] 解渴!!!!!!! :P 3x |
|
|
上一页
下一页