让 AI 做 LZ78 编码卡:字典边读边长,解码端也能跟着建回来

前天 3阅读

“压缩就是把重复内容缩短”很容易懂,真正不清楚的是双方怎样知道一个编号代表什么。可以让AI为LZ78做一套逐张翻开的教学卡:每一步只使用已经出现的字典项,最后不看原文也能复原全部字符。

让 AI 做 LZ78 编码卡:字典边读边长,解码端也能跟着建回来

AI模型生成的概念插图:重复符号与逐渐增加的字典卡相连接;不是实拍、实际压缩软件结果或正文码流的精确图解。

输入不长,但规则必须完整

原创字符串是ABABABAABC,共十个ASCII字符。字典初始只有编号0,对应空串。每一步在剩余输入开头找到字典里最长的匹配串,把它的编号与紧接着的一个字符组成一对;两者拼成新词组,放入下一个字典编号,再继续读取。

赫尔辛基大学的课程讲义给出了这种“旧词组编号加新字符”的LZ78描述。本例特意选在新词组处结束的输入,所有步骤都有可附加字符;其他输入可能需要另定末尾处理,不把省略的规则藏起来。

先看五张编码卡,再把原文盖住

第一张读A,输出(0,A),新增1=A;第二张读B,输出(0,B),新增2=B;第三张读AB,已有最长匹配A,输出(1,B),新增3=AB;第四张读ABA,输出(3,A),新增4=ABA;第五张读ABC,输出(3,C),新增5=ABC。

所以词组划分是A/B/AB/ABA/ABC。第三张不能引用编号3,因为AB要到这一步处理完成才加入;使用未来字典项会让解码端无从查找。第四张虽然含A和AB两个已知前缀,也应选择更长的AB。

独立解码只拿到五对数据,从空字典开始。每读一对,就取对应旧词组并附上新字符,同时按同样编号加入字典。得到A、B、AB、ABA、ABC,依次连接回ABABABAABC。本文用两个独立函数执行编码与解码,并逐字符比较原文和复原结果。

五对数据,不等于压缩成五个字节

若教学格式假设每个编号占一字节,每个字符也占一字节,五对正好占十字节,与十个ASCII原字符相同;这里还没有算文件头或结束标记。不能把“十个字符变五张卡”宣布为体积减半。字典编号增长、位宽安排和真实文件格式都会影响大小。

再把输入改成ABA:前两步加入A和B后,只剩已经在字典里的A,没有紧接的新字符。此时需要事先约定结束码、只发引用等具体机制。本练习要求AI明确报出这个边界,不可直接丢掉最后一个A,也不要临时换成LZW算法来补。

可复制的提示词

“为ABABABAABC制作LZ78逐步卡片,初始0为空串,每步取已建字典的最长前缀加下一个字符,新项按1、2、3递增。列读取区间、引用编号、附加字符、新词组和当时字典,禁止引用未来项。再只根据输出对独立解码并比较全文。按编号一字节、字符一字节计算本例载荷,不宣称真实文件压缩比。另分析ABA为何需要明确末尾规则,未指定规则时不要丢字符或改算法。”

这份卡片适合自己先推一步、再翻开下一步。AI负责把中间状态列清,回读一致与末尾边界负责检查;更长文本是否节省空间,需要采用明确的编码格式另测。

参考资料

University of Helsinki:Dictionary compression,LZ78

文章版权声明:除非注明,否则均为云鹊BLOG原创文章,转载或复制请以超链接形式并注明出处。