Skip to content

算法Algorithm

LZ78短语字典与同步重建

LZ78 · LZ78 dictionary coding

用旧短语编号加新字节创建字典项,规定末尾残余短语与结束token,证明编号有向无环且解码同步。

形式陈述 ​

LZ78把输入字节串逐步拆成新短语。字典初始只有 D[0]=ϵ。在未处理输入前端找字典中最长匹配短语 D[i];若后面还有字节 b,输出二元组 (i,b),把 D[i]b 作为下一个新编号加入字典,然后越过这整段短语。

若输入已用完且剩余前缀恰好是某个旧短语,本页另发终止token (i,END),只输出 D[i],不加字典项。即使残余为空也发 (0,END)。END是token类型标签,不与任何0至255的字节混用。这个末尾约定属于本教学协议;原始论文采用固定块长处理末短语,二者不能混称同一文件格式。

译码每收到普通token (i,b),要求 0≤i<|D|,输出 D[i]b,再以相同新编号存入它。收到终止token则输出旧短语后停止。若第 j 个新条目表示为 (parent=i, byte=b),必须有 i<j;字典引用图因此始终指向更早节点。

直觉

LZ77的号码是“离当前写位置有多远”;LZ78的号码是“字典中的第几条短语”。后者可以保留很久以前发现的完整短语,但字典会持续长大,编号字段也会变长。

双方不必预先共享一个大词库。编码端每次宣布“第i条后面加这个新字节”,译码端就能做出同样的新条目。新短语只增加一个后缀字节,因此用父指针表示比每次复制完整短语更节省字典空间。

例子与边界

输入 ABABABA 的短语分解为 A | B | AB | ABA,最后无残余:

  • (0,A):输出A,新增 D[1]=A
  • (0,B):输出B,新增 D[2]=B
  • (1,B):输出AB,新增 D[3]=AB
  • (3,A):输出ABA,新增 D[4]=ABA
  • (0,END):输出空串,停止

连起来恰是七个字节。另一个输入 ABABA 在得到A、B、AB三条后只剩A,它已经在字典中,故最后发 (1,END)。如果仅规定“每次都要发送旧编号加新字节”,这个末尾会无字节可发;丢掉它则错误恢复成ABAB。

空文件就是 (0,END)。输入 AAAA 可发 (0,A),(1,A),(1,END),对应 A | AA | A。一个没有字节的结束标记只能出现在最后;结束后还有token必须拒绝。收到 (7,B) 而当前字典只有编号0至3时,是向前引用,不允许预先创建第7条或无限等待它出现。

字典大小到达上限后,协议可以停止加条目、重置,或切换到新块,但必须事先固定规则。若编码器擅自重置而译码器继续增长,之后相同编号会表示不同短语。这里的检查器到达字典预算就明确失败,没有隐含的重置token。

推论与应用

同步和无环的证明 ​

初态两边仅有相同的空条目。若此前字典一致,合法编号 i 指向相同短语,追加同一个字节后得到相同输出和新条目,故字典继续一致。父编号严格小于新编号,所以沿父指针必定到0,不会构造循环。终止token只读已有条目,不改变这一归纳。

若当前已有 m 条含空条目的字典记录,编号可用 ⌈log2⁡m⌉ 位表示;最初 m=1 时编号0占零位,仍可由token标签和后面的字节区分动作。普通token还要8位字节和类型信息,END的编号也要编码。仅比较短语数量与原字节数,会漏掉增长的指针费用。本文定义token语义,不宣称给出了通用LZ78标准bitstream;完整的两个教学文件在流封装页使用Huffman和算术编码。

保存每条完整短语可能重复保存大量前缀。父指针、末字节和短语长度把字典描述控制为 O(k) 条记录,其中 k 为新短语数;解码一个短语需要沿父链逆序收集再输出。全部父链遍历工作与展开字节数同阶,所以是 O(k+n),另有最长短语长度的临时栈。实现必须在建栈之前用已保存的短语长度检查输出和工作预算。

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为明确说明的教学变体,未挪用原论文的块长格式
  • 本单元检查器:短语构造、父指针解码、末尾残余、空串、非法向前引用及字典容量测试
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系