收藏 分享(赏)

第十一讲 优先队列 Huffman树.ppt

上传人:hwpkd79526 文档编号:10124150 上传时间:2019-10-12 格式:PPT 页数:45 大小:425.50KB
下载 相关 举报
第十一讲 优先队列 Huffman树.ppt_第1页
第1页 / 共45页
第十一讲 优先队列 Huffman树.ppt_第2页
第2页 / 共45页
第十一讲 优先队列 Huffman树.ppt_第3页
第3页 / 共45页
第十一讲 优先队列 Huffman树.ppt_第4页
第4页 / 共45页
第十一讲 优先队列 Huffman树.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、哈夫曼树 与 树的应用,2009/04/02,2,本次课内容,作业讲评 堆-优先队列 Huffman树,3,通过后缀表达式生成树,算法: 每个数字生成为一个叶结点,入栈。 算符生成为一个结点,弹出两个叶结点,先右后左,链接生成一棵子树,入栈。 直到表达式尾,弹出最后一个元素作为树根。,4,按对称序,先跟序周游的结果重建树,对称序 先跟序 DBEACF ABDECF order2tree,5,6,7,8,9,二叉树的性质,性质1. 在非空二叉树的第i层上至多有2i个结点(i0)。 归纳:i=0, 结点数=1=20 .假设对于j(0j i), 结点数至多有2j .对于i=j+1,结点数至多为 2*

2、 2j=2j+1 . 性质2. 深度为k的二叉树至多有2k+1-1个结点(k 0)。k kM= mi 2i = 2k+1-1i=0 i=0,10,1,2,3,7,6,12,15,14,13,5,4,8,11,10,9,1,2,3,4,结点最多的二叉树:20+21+22+23,结点最少的二叉树:1+1+1+1,11,性质4.具有n个结点的完全二叉树的深度k为log2n .n=20+21+22+2k-1+mk=2k-1+mk2k-1n 2k+1-12k n 2k+1k log2n k+1k= log2n,12,12,堆的定义,堆的定义:n个元素的序列K=k0,k1,k2,kn-1当且仅当满足如下条

3、件时,称之为堆。ki k2i+1 或 ki k2i+1ki k2i+2 ki k2i+2 (i=0,1,2,.,n/2-1)从定义可以看出,若将此序列看成完全二叉树,则堆的含义表明,完全二叉树中每个非叶结点的排序码均大于等于(或小于等于)其左右子女结点的排序码。 如果堆中根结点的排序码最小,则称为小根堆。 如果堆中根结点的排序码最大,则称为大根堆,13,13,小根堆例子,23 59 10 7 814 12 11 16,14,14,优先队列,优先队列:遵循 “最小元素先出 ”的原则 基本操作: 创建一个空优先队列 PriorityQueue creatEmptyPriQueue(void) 若优

4、先队列为空,则返回1,否则返回0 int isEmpty(PriorityQueue s) 向s中添加元素e void add(PriorityQueue s,DataType e) 返回s中的最小元素 DateType min(PriorityQueue s) 删除s中的最小元素 void removeMin(PriorityQueue s) DateType deletMin(PriorityQueue s),15,15,优先队列的实现-1,用单链表实现 向s中添加元素e O(1) 删除s中的最小元素 O(n)用排序的单链表实现 可以实现对最小元素的快速查找与删除 但是,插入时为了保证有序

5、性,操作的代价成为O(n),16,优先队列的实现-2,用堆来实现,struct PriorityQueueint MAXNUM; /*堆中元素个数的上限*/ int n; /*堆中实际元素的个数*/DataType *pq; /*堆中元素的顺序表示*/ ; /*优先队列类型*/ typedef struct PriorityQueue *PPriorityQueue;/*指向优先队列的指针类型*/,17,插入操作的实现,插入元素必须保持堆序性 先把新元素放在最后位置 然后通过反复比较,必要时交换该结点与对应的父结点,直到堆序性重新满足 在处理过程中,考虑较大的元素逐步下降,放新元素的空位总是逐

6、渐上升,最后停在某个正确位置,这个方法通常称为筛选法,18,小根堆例子(插入元素),23 59 10 7 814 12 11 16 4,19,小根堆例子(插入元素),23 59 10 4 814 12 11 16 7,20,插入元素 4,239 10 5 814 12 11 16 7,4,21,在优先队列中插入元素,22,从优先队列中删除最小元素,删除元素必须保持堆序性 删除最小节点 用最后一个节点替代最小节点。 从同头开始调整成堆(shif),23,小根堆例子(删除元素),23 49 10 5 814 12 11 16 7,24,小根堆例子,3 49 10 5 814 12 11 16 7,

7、25,25,删除最小元素,37 49 10 5 814 12 11 16,26,27,优先队列算法复杂度分析,插入一个元素: logn O(logn) 删除一个元素:2 logn O(logn),28,大根堆(选作题),29,30,31,优先队列应用,用优先队列实现小任务优先。,32,哈夫曼树及其应用,哈夫曼树 哈夫曼算法 哈夫曼编码,33,扩充二叉树的概念,把原二叉树的结点都变为度数为2的分支结点 如果原结点的度数为2,则不变 度数为1,则增加一个分支, 度数为0(树叶),则增加两个分支。 空二叉树的扩充二叉树规定为只有一个外部结点组成的二叉树。,34,加权路径:,wi是第i个外部结点的权值

8、 li为从根到第i个外部结点的路径长度 m为外部结点的个数。 WPL = 1 x 5 + 2 x 70 + 3 x 18 + 3 x 7= 5 + 140 + 54 + 21 = 220,外部路径,35,两个概念,“外部路径长度” E:在扩充的二叉树里从根到每个外部结点的路径长度之和。其中,li为从根到第i个外部结点的路径长度,m为外部结点的个数。 设扩充二叉树具有m个带权值的外部结点,那么从根结点到各个外部结点的路径长度与相应结点权值的乘积的和,叫做扩充二叉树的带权的外部路径长度。其中,wi是第i个外部结点的权值,li为从根到第i个外部结点的路径长度,m为外部结点的个数。,36,哈夫曼树:,

9、对于一组非负实数w1 , w2 , w3 , wm,存在一棵以wi(i = 1,2,,m)为权的m个外部结点的扩充的二叉树,使得带权的外部路径长度WPL最小。这棵二叉树就称为哈夫曼树或最优二叉树。 WPL = 1 x 70 + 2 x 18 + 3 x 5 + 3 x 7= 70 + 36 + 15 +21 = 142,37,哈夫曼树(构建算法),给定m个权值 w1 , w2 , wm 构造由m棵二叉树组成的树林F = T1,T2,Tm,其中每棵树Ti 只有一个根结点,且根结点的权值为wi; 在树林中选取两棵根结点权值最小的和次小的二叉树作为左右子树构造一棵新的二叉树,其根结点的权值为左右子树

10、根结点权值之和。 将新的二叉树加入到树林F中,去除原两棵权值最小的树; 重复2、3步骤,直至F中只剩一棵树为止。,38,给定权值 7,5,2,4,构造哈夫曼树,39,哈夫曼树的存储实现,存储结构可以有多种,如二叉链表、三叉链表等。下面给出一种顺序结构(一维数组),结点结构:ww: 以该结点为根的子树中所有外部结点的加权和。 parent: 父结点在数组中的存储位置(下标),根无父,设为-1。 llink: 左孩子存储位置,对于外部结点,无孩子,设为-1。 rlink: 右孩子存储位置,对于外部结点,无孩子,设为-1。,ww,parent,llink,rlink,40,在线性结构上实现哈夫曼树,

11、struct HtNode /* 哈夫曼树结点的结构 int ww; int parent, llink, rlink; ;哈夫曼树可定义为:struct HtTree struct HtNode htMAXNODE;int root;/* 树根在数组中的下标*/; typedef struct HtTree *PHtTree;,41,哈夫曼算法(初始化),42,哈夫曼算法(构造树),思考:如果用堆结构实现huffman算法有没有问题?,43,44,问题分析:,优先队列的作用? 找最小值、次小值结点。 优先队列操作流程? 所有叶结点先入队。 弹出两个头部最小结点。 构造一棵子树。 子树头节点入队。,45,作业:,1、使用优先队列提高huffman树的构建效率。先思考解题方案,7号上机给出环境后再提交。提交:4月10日2、写一个函数seqTree(),输入一棵链接形式二叉树(根节点指针),返回(输出)一棵带父指针的顺序结构的二叉树。根节点放在下标为0的数组元素内。在3月31号作业的基础上实现。 要求写出解题算法思路。(选作 email提交 4月4号前),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报