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