1 介绍

说道编码,我们首先了解coding和decoding
eg:我们发送内容转换成二进制流进行发送,那么就是coding;接收方对二进制流解码的过程就是decoding

2 实例

假如有这么个4个字符,DONE。如下图1左上边显示,那么图1右边就是这个编码形式的二进制树展现形式;相对应,解码就是根据二进制流在二进制树上查找相对应的叶子节点返回即可。
【JAVA】初学哈夫曼编码及哈夫曼树

3 传输策略

我们希望发送时二进制流所占比特数越少越好,发现每个字符由几个比特构成取决这个节点的深度。我们经过左右两树交换,变成中间的树(完全二叉树)
【JAVA】初学哈夫曼编码及哈夫曼树
实际工作中,每个字符不太可能仅仅出现一次。很多情况下,一个字符会出现很多次。
于是,编码长度就不仅仅由深度决定,而且还有每个字符出现的次数有关,或者权重有关。我们通过贪心算法来对树进行调整:出现次数越多的字符,我们让它与根节点的距离越短,如下图所示变换。
【JAVA】初学哈夫曼编码及哈夫曼树
这个贪⼼算法就是哈夫曼发明的哈夫曼树。
从叶⼦节点开始,将权重最⼩的两个节点合并,向着根的⽅向⽣⻓⼀棵树,所以这棵树的⽣⻓⽅式只能是合并,即不断合并叶⼦节点合成⼦树,再把⼦树构成更⼤的⼦树,直到最终合成完整的⼀棵树。
哈夫曼编码的步骤就是统计每个字符出现频率,按照出现频率从⼩到⼤排序⽣成有序序列S,然后取出出现频率最⼩的两个节点(A,B)进⾏合并,合并后节点©的权重是⼦节点权重的和即:W© = W(a)+W(b),将合并后的节点C再排序后插⼊到S中,重复之前的步骤,直到合成⼀棵树。

相关文章:

  • 2021-07-12
  • 2021-07-10
  • 2021-05-06
  • 2021-10-04
猜你喜欢
  • 2021-12-10
  • 2021-12-09
  • 2021-05-10
  • 2021-05-28
  • 2021-06-02
相关资源
相似解决方案