哈夫曼编码

一、定义

        

       最简单的二进制编码方式是等长编码。例如,假定电文中只使用A、B、C、D、E、F这六种字符,若进行等长编码,则需要二进制的3位,可依次编码为000,001,010,011,100,101。若用这六个字符作为6个叶子结点,生成一棵二叉树,让该二叉树中每个分支结点的左、右分支分别用0和1编码,从树根结点到每个叶子结点的路径上所经分支的0,1编码序列应等于该叶子结点的二进制编码,则对应的编码二叉树如图7-8所示。


        在电文中每个字符的出现频率(即次数)一般是不同的,假定在一份电文中,这6个 字符的出现频率依次为4,2,6,8,3,2

        则电文被编码后的长度=编码长度*频率;总长度等于所有长度之和。

        若才一个不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样有可能缩短传送电文的总长度。采用不等长编码要避免译码的二义性和多义性。假设用0表示字符D,用01表示字符C,则当接收到编码串.......01...........,并译到字符0时,是立即译出对应的字符D,还是接着与下一个字符1一起译为对应的字符C,这就产生了二义性。因此,若对某一字符集进行不等长编码,则要求字符集中任一字符的编码都不能是其他字符编码的前缀。符合此要求的编码叫做无前缀编码。显然等长编码是无前缀编码,这从等长编码所对应的编码二叉树也可直观地看出,任一叶子结点都不可能是其他叶子结点的双亲,也就是说,只有当一个结点是另一个结点的双亲时,该结点的字符编码才会是另一个结点的字符编码的前缀。

       为了使不等长编码成为无前缀编码,可用该字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得传送电文的最短长度,可将每个字符的出现频率作为字符结点的权值赋予该结点上,求出此树的最小带权路径长度就等于求出了传送电文的最短长度。因此,求传送电文的最短长度问题就转化为求由字符集中的所有字符作为叶子结点,由字符的出现频率作为其权值所产生的哈夫曼树的问题。

       根据上面所讨论的例子,生成的编码哈夫曼树如图所示,有编码哈夫曼树得到的字符编码称做哈夫曼编码。在图中,A、B、C、D、E、F这六个字符的哈夫曼编码依次为101、000、01、11、100、001。电文的最短传送长度为:

L=WPL=4*3+2*3+6*2+8*2+3*3+2*3


        显然,这比等长编码所得到的传送电文总长度75要小得多。

        对已经介绍过的求哈夫曼编码带权路径长度的算法略加修改,就可以得到求哈夫曼编码的算法。具体给出如下:

//构造哈夫曼编码
	public static void outputHuffmanCoding(BTreeNode ft,int len,int[]a)
	{
		//根据ft指针所指向的哈夫曼树输出每个叶子的编码,len初值为0
		if(ft!=null)
		{
			//访问到叶子结点时输出其保存在数组a中的0和1序列编码
			if(ft.left==null&&ft.right==null)
			{
				System.out.print("结点权值"+(Integer)ft.element+"的编码为:");
				for(int i=0;i<len;i++)
				{
					System.out.print(a[i]+" ");
				}
				System.out.println();
			}
			//访问到非叶子结点时分别向左、右子树递归调用,并分别把分支上的0、1编码保存到数组a的对应元素元素中,向下深入一层时len值增1
			else
			{
				a[len]=0;
				outputHuffmanCoding(ft.left,len+1,a);
				a[len]=1;
				outputHuffmanCoding(ft.right,len+1,a);
			}
		}
	}


        




  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值