“对LZ77回指,先验证距离 $1\le d\le\min(W,p)$、长度范围和剩余输出/工作,再逐字节复制。对LZ78,先验证旧编号已经存在;利用条目中保存的短语长度计算展开长度,通过预算…”
形式陈述
LZ78把输入字节串逐步拆成新短语。字典初始只有
若输入已用完且剩余前缀恰好是某个旧短语,本页另发终止token
译码每收到普通token (parent=i, byte=b),必须有
直觉
LZ77的号码是“离当前写位置有多远”;LZ78的号码是“字典中的第几条短语”。后者可以保留很久以前发现的完整短语,但字典会持续长大,编号字段也会变长。
双方不必预先共享一个大词库。编码端每次宣布“第i条后面加这个新字节”,译码端就能做出同样的新条目。新短语只增加一个后缀字节,因此用父指针表示比每次复制完整短语更节省字典空间。
例子与边界
输入 ABABABA 的短语分解为 A | B | AB | ABA,最后无残余:
:输出A,新增 :输出B,新增 :输出AB,新增 :输出ABA,新增 :输出空串,停止
连起来恰是七个字节。另一个输入 ABABA 在得到A、B、AB三条后只剩A,它已经在字典中,故最后发
空文件就是 AAAA 可发 A | AA | A。一个没有字节的结束标记只能出现在最后;结束后还有token必须拒绝。收到
字典大小到达上限后,协议可以停止加条目、重置,或切换到新块,但必须事先固定规则。若编码器擅自重置而译码器继续增长,之后相同编号会表示不同短语。这里的检查器到达字典预算就明确失败,没有隐含的重置token。
推论与应用
同步和无环的证明
初态两边仅有相同的空条目。若此前字典一致,合法编号
若当前已有
保存每条完整短语可能重复保存大量前缀。父指针、末字节和短语长度把字典描述控制为
LZ78是根据前缀形成字典的机制。其渐近通用性结论需要明确源类或有限状态编码比较类,不能由这个四token例子推出所有短文件都会缩小。它也不是LZW;LZW使用不同的码输出和字典更新规则,有自己的特殊解码情形。
参考资料
- Jacob Ziv、Abraham Lempel,Compression of Individual Sequences via Variable-Rate Coding,IEEE TIT 24(5),1978,§II,特别是p.533的incremental parsing、旧短语加末字母与逆向恢复。本文END残余token为明确说明的教学变体,未挪用原论文的块长格式
- 本单元检查器:短语构造、父指针解码、末尾残余、空串、非法向前引用及字典容量测试