C++哈夫曼树和哈夫曼编码详解

本文详细介绍了哈夫曼树的概念、性质和构建过程,以及哈夫曼编码的生成方法。通过理论与实践相结合,阐述了如何根据给定字符及其概率构建哈夫曼树和相应的哈夫曼编码,并提供了相应的C语言实现代码。哈夫曼树是一种带权路径长度最短的二叉树,其编码是前缀编码,能有效实现数据的压缩。

        理论部分

        先补充一个概念,什么是路径长度?

        从树中一个节点到另一个节点之间的分支构成这两个节点之间的路径,路径上的分支数目称作路径长度。而一般不带权的单个路径长度默认为1,所以可以认为节点数为n的树的路径长度为n-1。

        哈夫曼树的定义是带权路径长度最短的树,也叫最优二叉树。换种更好的理解方式,就是一棵特殊的二叉树,而这棵树的叶子节点到根节点的带权路径都是尽可能最短的

        如下图:

        树a的路径长度就是7*2+5*2+2*2+4*2=36。

        树b的路径长度就是7*3+5*3+2*1+4*2=46

        树c的路径长度就是7*1+5*2+2*3+4*3=35

        明显,树c的路径长度最小,但它是最优二叉树吗?

        想要验证树c是不是哈夫曼树,就得从定义出发。带权路径长度最小,那么很容易想到,权重大的路径所在的层数一定偏小,而权重小的路径层数就偏小。那么很容易联想到,把权重小的路径先找出来并放在下面。经过总结可得出以下结论:

        (1)根据给定的n个权值 {w1,w2,⋯,wn} 构成n棵二叉树的集合 F={T1,T2,⋯,Tₙ}, 其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。
        (2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
        (3)在F中删除这两棵树,同时将新得到的二叉树加入F中。
        (4)重复(2)和(3),直到F只含一棵树为止。这棵树便是赫夫曼树。

哈夫曼编码前缀编码
        前缀编码:如果在一个编码方案中, 任一个编码都不是其他任何编码的前缀(最左子串),如称编码是前缀编码。前缀编码可以保证对压缩文件进行解码时不产生二义性,确保正确解码。

      &n

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值