我开始编写一个小程序,允许使用LZ77压缩算法压缩单个文件。它运行良好。现在我正在考虑如何存储数据。在LZ77中,压缩数据由一系列三元组组成。每个三元组具有以下格式:<"start reading at n. positions backwards", "go ahead for n. positions", "next character">
存储这些三元组的正确方法是什么?我想:<11,5,8>位,然后:
- 向后看2048个位置
- 匹配字符串的最大长度为32
- 下一个字符是1字节
这种格式在文本压缩中效果很好,但对我来说很糟糕(由二进制图像制成的视频(,与原始文件大小相比,它也增加了大小。你有什么建议吗?
我认为你的意思更像是:<返回n,复制k,插入文字字节>。
你需要查看比赛的统计数据。您可能会得到许多长度匹配为零的文字字节。在这种情况下,一个好的开始是用一个比特来决定是否匹配。如果比特是一,那么它后面跟着一个距离、长度和文字字节。如果它是一个零,那么后面只跟一个文字字节。
通过对文字、长度和距离进行霍夫曼编码,您可以做得更好。长度和文字可以像deflate一样组合成一个代码,甚至可以删除一位。