哈夫曼编解码算法(C实现)

本文介绍了如何通过哈夫曼树提高字符编码传输效率,以解决传输字符"BADCADFEED"的问题。通过构建哈夫曼树,实现了更高效的编码方式,减少了所需bit位数。文章详细阐述了哈夫曼树的构造过程,并提供了C语言实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记得在毕业前去找工作,应聘康佳集团移动应用工程师的笔试题出了这么一道题。

传输文本字符”BADCADFEED”,只能出现”ABCDEF”这六个字符,使用以下的编码方式:



如传输字符:BADCADFEED          接收编码:001000011010000011101100100011

 

接收方可以根据每3个bit进行一次字符解码的方式还原文本传输的信息,但是这样的传输效率太低了,需要30bit才发送10个字符。如何编码来提高传输以及接收效率???请写出你的编码方式以及算法思想。

我当时并没有想到解决方法,GG了。最近运用到霍夫曼树,现在回想起来不就是这个算法吗,哈哈哈,太好了。在这里总结一下。

 

引入:

要提高效率,必须要从编码方式去改变,这是无疑的。这里运用了避免每一个字符都占有相同的bit位。如



如传输字符:BADCADFEED          接收编码:1001010010101001000111100 

改进编码方式之后,可以看到发送相同的字符,需要25bit位就可以表示10个字符了。这种编码明显是有很大优势的。

 

问题:这个编码方式有什么规律呢?怎么得到呢?又是如何在接收方解码的呢?下面来揭开神奇的面纱。

假定经过统计得出ABCDEF在所需传输报文出现的概率如下:

 

霍夫曼树算法: 

给定实数w1,w2,···,wt且 w1<=w2<=···<=wt           

(1)连接w1,w2为权的两片树叶,得一分支点,其权为w1+w2 ;

(2)在w1+w2, w3+···+wt中选出两个最小的权,连接它们对应的顶点(不一定都是树叶),得分支点及所带的权;

(3)重复(2),直到形成t – 1个分支点,t片树叶为止

 

或者这样描述算法:

1、给定n个数值{ v1, v2, …, vn}

2.根据这n个数值构造二叉树集合F

F = { T1, T2, …, Tn}           Ti的数据域为vi,左右子树为空

3.在F中选取两棵根结点的值最小的树作为左右子树构造一棵新的二叉树,这棵二叉树的根结点中的值为左右子树根结点中的值之和</

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值