问题描述
我正在为使用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。如果到达分支并且没有 代码,则您将再次拥有一片叶子,但这一次,如果到达则将导致解码错误。
要解码,请使用第一位并沿该分支向下移动。根据第二位选择第二个分支。依此类推,直到您一片叶子。然后发出该符号,并从下一位开始重新从根开始。否则终止,如果您遇到错误页面。