哈夫曼编码步骤如下:

       第一步,将信息符号按其出现概率从大到小排列;

       第二步,将两个最小概率组成一组,划成2 个分支域,并标以0 和1;再把2 个分支域合并成1个支域,标以两个概率之和;

       第三步,依次类推,直到概率之和等于1.0;

      第四步,找出概率和1.0 到各信息符号的路径,记下各路径从右到左各分支域的0 和1,即得到信息符号相应的码字。

       理论上,这种编码是最佳的。实际上,利用硬件实现时,出现概率不可能精确到小数后多少位,而最小存储单元为1bit,会引起概率匹配不准确及编码效率的下降。简易理解就是,假如我有A,B,C,D,E五个字符,出现的频率(即权值)分别为5,4,3,2,1,那么我们第一步先取两个最小权值作为左右子树构造一个新树,即取1,2构成新树,其结点为1+2=3,如图:


视频压缩编码技术(H.264) 之哈夫曼编码_java


       虚线为新生成的结点,第二步再把新生成的权值为3的结点放到剩下的集合中,所以集合变成{5,4,3,3},再根据第二步,取最小的两个权值构成新树,如图:


视频压缩编码技术(H.264) 之哈夫曼编码_java_02



再依次建立哈夫曼树,如下图:


视频压缩编码技术(H.264) 之哈夫曼编码_java_03


其中各个权值替换对应的字符即为下图:


视频压缩编码技术(H.264) 之哈夫曼编码_java_04


       所以各字符对应的编码为:A->11,B->10,C->00,D->011,E->010

霍夫曼编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。