如何编写a并在PHP中读取经过修改的!Huffman代码的二进制树

问题描述

我正在为使用modified Huffman代码编码的传真数据解码编写类。

数据逐行编码:数据描述每个像素行。行被编码为可变长度的记录。像素位存储在代码字的位中,最低有效位在前。

最近,代码字列表(182个元素)被定义为数组:

/**
 * [0] code word
 * [1] length of code word
 * [2] run length of color bits
 * [3] 0 = white / 1 = black
 * [4] 1 = termination codes / 0 = make up codes
 */
const CODEWORDS = [
   [0b00110101,8,1],// termination codes white
   [0b000111,6,1,[0b0111,4,2,[0b1000,3,[0b1011,[0b1100,5,[0b1110,[0b1111,7,[0b10011,...
];

在使用之前,根据代码字的长度对数组进行降序排序。

在第一种方法中,我可以通过在此数组上重复foreach迭代来找到正确的代码字-但这(并不奇怪!)非常慢

对我来说很明显,只有使用二叉树才能提高性能。 但是,即使查看了这里的几种解释或GitHub中的解决方案(库),我仍然找不到对它的访问权限

  • 如何将数据从数组传输到二叉树
  • 如何浏览树以获取正确的叶子

如果有人可以帮助我,我将非常感激。

解决方法

一旦您有了正确的代码(请参阅我对问题的评论),那么您将从建立一套白色代码和一套黑色代码开始。对于每个树,您从树的第一位为零的分支开始,然后从一个分支为一开始。将您的一组代码分成两组,一组将所有代码都从零开始,而另一组将所有代码都从一个开始。对于每一个,建立两个分支。根据第二个位分解每个集合。一旦使用一个代码到达分支,并且只使用了该代码的最后一部分,便有了一片叶子。在该叶子中,您存储了代码的符号,例如白色代码00110100为63。如果到达分支并且没有 代码,则您将再次拥有一片叶子,但这一次,如果到达则将导致解码错误。

要解码,请使用第一位并沿该分支向下移动。根据第二位选择第二个分支。依此类推,直到您一片叶子。然后发出该符号,并从下一位开始重新从根开始。否则终止,如果您遇到错误页面。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...