数据结构 --- 哈夫曼树基础

哈夫曼树(最优树)及其应用

路径长度的概念
1.路径:从一个结点到另一个结点之间的分支序列
2.结点之间的路径长度:从一个结点到另一个结点之间的分支数目
3.树的路径长度(用PL表示):从树的根到每一个结点的路径长度之  深度之和

PL = 0+1+1+2+2+2+2+3=13

PL = 0+1+1+2+2+3+3+3=15

结点的权:
给树的每个结点赋予的一个具有某种实际意义的实数。

结点的带权路径长度:
从该结点到树根之间的路径长度与结点上权的乘积

树的带权路径长度:
树的所有叶结点的带权路径长度之和

WPL=7*2+5*2+2*2+4*2=36

树的带权路径长度记作:
其中:Wi为树中每个叶子结点的权,L i为每个叶子结点到根的路径长度

 WPL最小的二叉树就称作最优二叉树或哈夫曼树

哈夫曼树

       带权路径长度达到最小的扩充二叉树即为哈夫曼树。哈夫曼树中,权值大的结点离根最近。

哈夫曼树的应用

(1)前缀码:如果在一个编码系统中,任一个编码都不是其他任何编码的前缀(最左子串),则称该编码系统中的编码是前缀码。例如,一组编码01,001,010,100,110就不是前缀码,因为01是010的前缀,若去掉01或010就是前缀码。例如,名字中的郑霞、郑霞锦就不是前缀码。
(2)哈夫曼编码:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的通路上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。

(3)哈夫曼编码主要用于压缩、解缩

哈夫曼树的构建

通过单词出现的次数构建哈夫曼树

原有数据(单词出现的次数):7 5 2 4

每次从原有数据中挑两个最小的,小的放左边,大的放右边:挑出 2 和 4,构建新节点 6,再把新数据 6 丢到原有数据中,再挑两个最小的出来...从而构建哈夫曼树

哈夫曼编码:往左边走是0,往右边走是1

用堆的实现,小顶堆:每次从原有数据中拿两个最小的,贪心算法的思想

a 字符存储占用一个字节,现在内存中用 0 表示即可

a b c d d d - -> 原来存储占用 6个字节

用二进制去存储所需要的内存:0 10 110 111 111 111,二进制中8位表示一个字节,用 2 个字节就可以完全存储,因此可以用来做压缩,哈夫曼树主要用于做字符串的编码

01 和 0 不能同时存在,假设 0 表示 a,01 表示 b,做拆分时不能做区分是指 a 还是 b:在一个编码系统中,任一个编码都不是其他任何编码的前缀

编码表:a:0,b:10,c:110,d:111

还原字符串:010110111111111,找字符0,01在编码中不存在,因此可以把0拆分开来...101 在编码中不存在,因此,可以拆分出10...

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值