哈夫曼树

对于一个共有n个结点、K条边的森林,共有几棵树?

由一颗树的性质:结点等于边+1【n= k+ 1】。

等价于 n - k =1。

故共有 n - k 棵树。

基本概念

路径:从一个结点到另一个结点之间的分支序列

路径长度:从一个结点到另一个结点所经过的分支数目

结点的权值:树中每个结点所赋予的具有某种实际意义的实数,

带权路径长度:从根到某一结点的路径长度与该结点权值乘积

树的带权路径长度:树中从根到所有叶子结点的各个带权路径长度之和

最优二叉树:

在叶子个数 n 以及各叶子权值Wi确定的条件下、树的带权路径长度WPL值最小的二叉树称为最优二叉树。

最优二叉树的特点:权值越大、离根越近

哈夫曼树的定义

哈夫曼树是由 n 个带权叶子结点所构成的所有二叉树中带权路径长度最短的二叉树。

构造哈夫曼树的算法步骤

哈夫曼树的特点

没有度为1的结点

n个叶子结点的哈夫曼树共有2n-1个结点(生成n-1个非叶子结点)

哈夫曼树的任意非叶子结点的左右子树交换后仍是哈夫曼树

对同一组权值  {W1,W2,......Wn}  、存在不同结构的两颗哈夫曼树、但他们的带权路径长度(WPL)一定是一样的

哈夫曼树的类型定义

n个叶子结点的哈夫曼树共有2n-1个结点,因此可用有2n-1个元素的一维数组来存储哈夫曼树的各个结点,结点间的父

子关系用下标来指示;在使用哈夫曼树进行编码和译码时,既要用结点的双亲信息,又要用结点的孩 信息,所以采用

静态三叉链表来存储哈夫曼树。
 

 

哈夫曼树的算法实现

初始化:先将n个元素都视为根结点,即孩子和双亲指针全置0。

建哈夫曼树的过程是:反复在数组中选双亲为0(表示它们当前是树根)且权值最小的两结点,将它们作为左右孩子挂在

新的结点之下,新结点权值为左右孩子权值之和。
 

依次循环往复

 

哈夫曼树编码基本概念

在信息传输等实际应用中,需要将文本中出现的字符进行二进制编码,传输过后,又要将二进制码翻译为原先的字

符,这就是典型的编码和译码问题。

在编码的设计中,通常遵守两个原则:

(1)/编码能够唯一地被译码。

(2〉编码长度要尽可能的短。

利用哈夫曼树可以得到平均长度最短的编码,因此在信息传输、数据压缩等方面,哈夫曼树有着广液的应用。
 

 

前缀编码:任何一个字符的编码都不是另一个字符的编码的前缀,这种编码方式称为前缀编码。

 

 

如何进行哈夫曼编码

————哈夫曼树是树的带权路径长度值为最小的二叉树,其特点就是:叶子结点权值越大,离根越近。
————构造不等长编码的原则是:字符使用频率越高,编码越短。
————用哈夫曼树设计编码的设想是:
      每个待编码的字符对应一个叶子结点;每个字符的使用频率对应叶子的权值;每个字符的编码对应根到叶子的路径;
 

对哈夫曼树中每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的值构成该叶子结点的哈夫曼

编码。

例:若要传输如下单词

state, seat, act, tea, cat, set, a, eat

如何使所传送的信息编码长度最短?

为保证信息编码长度最短,先统计各字符出现的次数,然后以此作为权值,构建哈夫曼树。

结论一:哈夫曼编码是前缀码。

字符不同则对应的叶子不同,因为从根到每个叶子的路径是不同的,所以根到一个叶子的路径不可能是到另一个叶子

路径的前段,即一个字符的编码不可能是另一个字符编码的前缀,因此哈夫曼编码是前缀码。
 

结论二:哈夫曼编码是最优前缀码。

哈夫曼编码的构造及算法实现

哈夫曼编码的译码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值