LZW | ||||||||||||||
默认字典 | 字符说明 | |||||||||||||
0 | a | P | 当前维护的子串。在字典中有值,但未输出 | |||||||||||
1 | b | C | 当前读取的字符 | |||||||||||
2 | c | pW | (previous word)上一个编码 | |||||||||||
cW | (current word)当前编码 | |||||||||||||
编码 | 解码 | |||||||||||||
原始字符串:ababcababac | 压缩流:0132372 | |||||||||||||
编码规则: 1. 初始状态,字典里只有所有的默认项,例如0->a,1->b,2->c。此时P和C都是空的。 2. 读入新的字符C,与P合并形成字符串P+C。 3. 在字典里查找P+C,如果: - P+C在字典里,P=P+C。 - P+C不在字典里,将P的记号输出;在字典中为P+C建立一个记号映射;更新P=C。 4. 返回步骤2重复,直至读完原字符串中所有字符。 |
解码规则: 1. 初始状态,字典里只有所有的默认项,例如0->a,1->b,2->c。此时pW和cW都是空的。 2. 读入第一个的符号cW,解码输出。注意第一个cW肯定是能直接解码的,而且一定是单个字符。 3. 赋值pW=cW。 4. 读入下一个符号cW。 5. 在字典里查找cW,如果: a. cW在字典里: (1) 解码cW,即输出 Str(cW)。 (2) 令P=Str(pW),C=Str(cW)的**第一个字符**。 (3) 在字典中为P+C添加新的记号映射。 b. cW不在字典里: (1) 令P=Str(pW),C=Str(pW)的**第一个字符**。 (2) 在字典中为P+C添加新的记号映射,这个新的记号一定就是cW。 (3) 输出P+C。 6. 返回步骤3重复,直至读完所有记号。 |
|||||||||||||
步骤 | P | C | P+C | P + C 是否在字典中 | 动作 | 输出 | 步骤 | pW | cW | cW 是否在字典中 | 动作 | 输出 | ||
1 | / | a | a | 1 | P=a | / | ||||||||
2 | a | b | ab | 0 | 添加 3->ab,更新 P=b | 0 | 1 | / | 0 | 1 | pW=cW | a | ||
3 | b | a | ba | 0 | 添加 4->ba,更新 P=a | 1 | 2 | 0 | 1 | 1 | 添加 3->ab,pW=cW | b | ||
4 | a | b | ab | 1 | 更新 P=ab | / | ||||||||
5 | ab | c | abc | 0 | 添加 5->abc,更新 P=c | 3 | 3 | 1 | 3 | 1 | 添加 4->ba,pW=cW | ab | ||
6 | c | a | ca | 0 | 添加 6->ca,更新 P = a | 2 | 4 | 3 | 2 | 1 | 添加 5->abc,pW=cW | c | ||
7 | a | b | ab | 1 | 更新 P=ab | / | ||||||||
8 | ab | a | aba | 0 | 添加 7->aba,更新 P=a | 3 | 5 | 2 | 3 | 1 | 添加 6->ca,pW=cW | ab | ||
9 | a | b | ab | 1 | 更新 P=ab | / | ||||||||
10 | ab | a | aba | 1 | 更新 P=aba | / | ||||||||
11 | aba | c | abac | 0 | 添加 8->abac,更新 P=c | 7 | 6 | 3 | 7 | 0 | 添加 7->aba,pW=cW | aba | ||
12 | c | / | c | 1 | / | 2 | 7 | 7 | 2 | 1 | 添加 8->abac,pW=cW | c |