数据结构与算法之哈夫曼树

带权路径长度

  1. 结点的权:有某种现实含义的数值 (如:表示结点的重要性等)
  2. 结点的带权路径长度:从树的根到该节点的路径长度 (经过的边数) 与该结点上权值的乘积
  3. 树的带权路径长度:树中所有叶节点的带权路径长度之和 (WPL,Weighted Path Length)

哈夫曼树的定义

在含有 n 个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树

哈夫曼树的构造

给定 n 个权值分别为 w 1 w_1 w1, w 2 w_2 w2,…, w n w_n wn的结点,构造哈夫曼树的算法描述如下:

  1. 将这 n 个结点分别作为 n 棵仅含有一个结点的二叉树,构成森林 F。
  2. 构造一个新节点,从 F 中选取两颗根节点权值最小的树作为新根结点的左、右子树,并且将新节点的权值置为左、右子树上的根节点的权值之和。
  3. 从 F 中删除刚才选出的两颗树,同时将新得到的树加入 F 中。
  4. 重复步骤 2 和 3,直至 F 中只剩下一颗树为止。

大白话说明

题目

步骤

  1. 首先将给出的序列排序
    1. 原数列:19,21,2,3,6,7,10,32
    2. 排序后:2,3,6,7,10,19,21,32
  2. 选出两个==最小==的树
    1. 这里是 2,3
  3. 将选出的两个数从数列中去除并且将两个数的和放入数列中
    1. 5,6,7,10,19,21,32
  4. 重复第一步,直到数列为空。

视频链接如下:
https://www.bilibili.com/video/BV1wX4y1M7TG?spm_id_from=…search-card.all.click

构造步骤如下图:


  1. 此时树的带权平均路径是最小的,且为: W P L m i n = 1 ∗ 7 + 2 ∗ 3 + 3 ∗ 2 + 4 ∗ 1 + 4 ∗ 2 = 31 WPL_{min}=1*7+2*3+3*2+4*1+4*2=31 WPLmin=17+23+32+41+42=31

注意

  1. 每个初始结点最终都称为叶节点,且权值越小的结点到根节点的路径长度越大
  2. 哈夫曼树的结点总数为 2 n − 1 2n-1 2n1
  3. 哈夫曼树中不存在度为 1 的结点
  4. 哈夫曼树并不唯一,但 WPL 必然相同且为最优。

哈夫曼编码

电报——点、划两个信号 (二进制 0/1)
固定长度编码——每个字符用相同长度的二进制位表示

ASCII 编码

A —— 0100 0001  
B —— 0100 0010  
C —— 0100 0011  
D —— 0100 0100

每个字符用长度为 2 的二进制表示 (减少长度,提高空间的利用率)

A —— 00  
B —— 01  
C —— 10  
D —— 11

假设,100 个题有 80 题选 C,10 题选 A,8 题选 B,2 题选 D
所有答案的二进制长度为: 80 ∗ 2 + 10 ∗ 2 + 8 ∗ 2 + 2 ∗ 2 = 200 80*2+10*2+8*2+2*2=200 802+102+82+22=200bit,而这个转换成树结构为:

按照:左为 0,右为 1 的原则


此时 WPL:200,思考是否可以在优化?使用哈夫曼树进行排列,如下图

  1. C–0(树的路径)
  2. A–10
  3. B–111
  4. D—110

为什么使用叶子节点存储选项

首先,假设使用非叶子节点存储数据,结构如下图:

假如传输的数据是:CAAABD,转换成编码就是:0111111110,而此时连续的 111111 就是给解码方带来困惑,会有多种解读意思。

  1. 可变长度编码:允许对不同字符用不等长的二进制位表示。
  2. 若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码
  3. 前缀解码无歧义,非前缀解码有歧义
  4. 有哈夫曼树得到的哈夫编码——字符集中的每个字符作为一个叶子节点,各个字符出现的频度作为节点的权值,根据之前的介绍 构造哈夫曼树
  5. 哈夫曼树编码不唯一

考点

计算英语字母频次

知识回顾与重要考点

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据结构与算法分析》实验报告 姓名 学号_ _____ __年 __月__ __日 上机题目:以静态链表为存储结构,编写给定权值{7,19,2,6,32,3}构造哈夫曼树算法。 (输出以存储结构表示或以树型显示(90度旋转)) 需求分析 1. 输入据必须为int的整形据,其值范围为:-~47 2. 输出的据格式为:%d 3. 测试据的据为:{7,19,2,6,32,3} 详细设计 1. 该程序采用顺序表的存储结构,其数据结构定义如下: #define n 6 #define m 2*n-1 #define max 100typedef struct {int data; int lchild,rchild,prnt; }hufmtree; 所用据类型中每个操作的伪码算法如下: 创建哈夫曼树 Program hufm(hufmtree t[m]) FOR i=0;i<m;i++ TO t[i].data=0; t[i].lchild=0; t[i].rchild=0; t[i].prnt=0; End FOR 输入结点值 FOR i=n;i<m;i++ TO p1=0;p2=0; small1=max;small2=max FOR j=0;j<=i-1;j++ TO IFt[j].prnt?=0 IF(t[j].data<small1) small2=small1; small1=t[j].data; p2=p1; p1=j;} ELSE IF(t[j].data<small2) small2=t[j].data; p2=j; t[p1].prnt=i+1; t[p2].prnt=i+1; t[i].lchild=p1+1; t[i].rchild=p2+1; t[i].data=t[p1].data+t[p2].data; END IF END FOR END Hufman 调试分析 1. 调试过程中主要遇到哪些问题?是如何解决的? 开始的时候main函数据结构类型定义的与主函不同,而且缺少返回值,导致最 后的结果陷入死循环,通过看书,向同学询问,得以解决。 2. 经验和体会 哈夫曼树又称最优二叉树,此次实验创建哈夫曼树算法,虽然依旧犯了不少错误,但 仍解决了。在其中学习了很多,对树有了更深的了解。 测试结果 附件 见 058詹奇.Cpp ----------------------- 数据结构与算法分析实验报告全文共3页,当前为第1页。 数据结构与算法分析实验报告全文共3页,当前为第2页。 数据结构与算法分析实验报告全文共3页,当前为第3页。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

five-five

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

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

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

打赏作者

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

抵扣说明:

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

余额充值