我一直在研究 RFC 1951(DEFLATE 压缩算法),发现了 Mark Adler 的有趣的“学习”源文件,名字很可爱——puff.c。虽然通过合理地遵循 RFC-1951 规范,大脑解析该文件是一种启发性的体验,但作者做了一些我不太清楚的事情——他改变了索引长度数组的顺序。
代码注释中的解释有点模糊:
码长码长按置换顺序接收(参见下面的 order[] 数组),以便更可能生成短码长码长列表。事实证明,在动态代码描述中不太可能看到非常短和非常长的代码,因此最初可能看起来是一种特殊的顺序。
这是楼上描述的排列数组:
static const short order[19] = /* permutation of code length codes */
{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
所以,我的问题是:
- 为什么在 RFC-1951 中没有提到这一点?
- 他们如何决定 中列出的确切排列
order
? - 它是如何工作的?由于顺序已更改,为什么解码过程不会失败?
非常感谢。这不是作业,我也不是为了学习经验而试图超越原始算法。我搜索了这个网站,谷歌是我的朋友,但无济于事。