用字典编号代表变长片段

字典先包含允许的单个符号。编码者在尚未处理输入中寻找字典里最长的匹配前缀,输出它的编号,再把这段前缀加上下一个字符作为新条目,供后续遇到更长重复内容时使用。

这里不是先统计每个字符的频率再给它安排短码字,而是把多字符片段逐步变成一个可复用单位。连续出现的相同片段,不必每次按原字符完整写出;字典的内容由先前处理的输入决定。

参考:[1]

解码端也按规则扩展字典

解码者从相同初始字典开始,把编号还原为片段,再用前一片段与当前片段的首字符补入新条目,因此不必把完整最终字典另行传送。双方更新顺序必须一致,否则之后相同编号会被解释为不同内容。

还存在当前编号正好指向解码端即将建立的新条目的特殊情形。教材实现用“前一片段加上它自己的首字符”恢复该片段,再继续更新;不能把所有暂未出现在解码表中的合法编号都简单当作输入损坏。

参考:[1]

码宽与字典耗尽策略必须一致

Princeton教学版本用12位编号、4096个槽位,字典满后停止添加,并用保留编号表示结束。其他格式可以逐步增加码宽或重置字典;这些是双方必须共同执行的协议,不能在不告知解码者时任意更换。

压缩率依赖可利用的重复及编号开销,运行速度也依赖字典检索和输入表示。教材明确提醒其反复截取字符串的Java示例,在复制子串的实现中会带来二次方时间;算法思想不能掩盖具体程序的分配与复制成本。

参考:[1] [2]