第九章 堆与优先队列
description
Transcript of 第九章 堆与优先队列
![Page 1: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/1.jpg)
第九章 堆与优先队列
山东财经大学管理科学与工程学院
![Page 2: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/2.jpg)
9.1 优先队列的基本概念 定义
优先队列中的每一个元素都有一个优先级值。优先队列中元素 x 的优先级值记为 p(x) ,它可以是一个实数,也可以是一个一般的全序集中的元素。
基本运算Size( )
返回优先队列中元素个数。Emputya()
判断优先队列是否为空Min( )
返回优先队列中具有最小优先级值的元素。push(x)
将元素 x 插入优先队列。Pop_Min(x)
删除优先队列中具有最小优先级值的元素,并保存到 x 中
![Page 3: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/3.jpg)
优先队列举例
排队上车,老弱病残者优先上车排队候诊,危急病人优先就诊洗相馆为顾客洗照片,加钱加急者优先洗分时操作系统运行程序,小程序优先贪心算法对解分量的选择,按元素的某种特征值,大
( 或小 ) 的优先在一个集合中搜索,按元素的某种特征值,大 ( 或小 )
的优先 处理或服务时只关心对象中谁的优先级最高通常
的队列是一种优先队列最先到者优先级最高
![Page 4: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/4.jpg)
9.3 优先级树和堆
极小化优先级树树中每一结点存储一个元素。
任一结点中存储的元素的优先级值不大于其儿子结点中存储的元素的优先级值父结点的优先级不高于其儿子结点的优先级。
越接近根的结点中的元素的优先级越高
极大化优先树
![Page 5: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/5.jpg)
堆如果一棵优先级树是一棵近似满二叉树,那么,这棵
具有优先级性质的近似满二叉树 ( 外形像堆 ) 就叫做堆
极小化堆 极大化堆
8
16 9
1
6
2
1110 5
4
1 6
8
12
9
16
2
11 5 14
![Page 6: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/6.jpg)
关键字: 12 19 65 38 27 73
12
19 65
38 27
例如 :
是堆(最小堆)
73
![Page 7: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/7.jpg)
关键字: 12 19 65 38 27 36
12
19 65
38 27 73
是堆36
不
![Page 8: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/8.jpg)
[ 12 19 27 11 20] [12 19 65 38 27 73]
12 12 19 27 19 65
11 20 38 27 73
堆的判断练习
非 堆 是 堆
![Page 9: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/9.jpg)
堆的删除
删除堆中最底层、最右边的叶结点,并用其中所存放的元素取代树根中应该删除的元素,然后对堆进行调整。
30
10
15
20
2540
25
50
30
50
15
20
2540
25
30
15
50
20
2540
25
30
15
20
50
2540
25
![Page 10: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/10.jpg)
堆的插入
先将存放新元素的结点添加在堆的最底层,使之成为一棵近似满二叉树,然后进行调整。
30
15
20
50
2540
25 8
30
15
20
50
258
25
40
30
15
20
50
8
25
25
40
30
8
20
50
1525
25
40
![Page 11: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/11.jpg)
建堆
自下而上,从右到左( 26 , 5 , 77 , 1 , 61 , 11 , 59 , 15 ,
48 , 19 )
1
26
775
591161
15 48 19
![Page 12: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/12.jpg)
1
26
775
591161
15 48 19
初始完全二叉树
1
26
775
591161
15 48 19
1
19
61
1
26
775
591119
15 48 61
2
48
1
![Page 13: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/13.jpg)
建堆
{ 75, 87, 68, 92, 88, 61, 77, 96, 80, 72}
![Page 14: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/14.jpg)
霍夫曼编码
使用一个字符在文件中出现的频率表来建立一个用 0 , 1 串表示各字符的最优表示方法
树的带权路径长度:
树中所有叶子结点的带权路径长度之和
![Page 15: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/15.jpg)
27 9
7 5
4
9
2
WPL(T)=
72+52+23+43+92
=60
WPL(T)=
74+94+53
+42+21
=89
5
4
![Page 16: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/16.jpg)
前缀码
定义为了解码时不会出现二义性,要求任意一
个字符的编码不能是另一个字符的前缀。例
{a = 0 , b = 101 , c = 100 , d= 111 , e = 1101 , f = 1100}
001011101aabe
![Page 17: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/17.jpg)
霍夫曼编码
构造最优前缀码的算法根据给定的 n 个权值 {w1, w2, …, wn} 构造
n 棵二叉树的集合 F = {T1, T2, … , Tn} ,其中每棵二叉树中均只含一个带权值 为 wi 的根结点 , 其左、右子树为空树 ;
在 F 中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和 ;
从 F 中删去这两棵树,同时加入刚生成的新树 ;重复 (2) 和 (3) 两步,直至 F 中只含一棵树为止。
![Page 18: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/18.jpg)
例
给定一组权值为 {2 , 4 , 5 , 7} ,试构造一棵哈夫曼树。
( 1)
2 4 75
( 2)
2 4 75
42
6
![Page 19: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/19.jpg)
( 3)
42
6 75
( 4)
42
6 75
11
![Page 20: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/20.jpg)
( 5)
42
6
7
5
11
18
42
7
5
哈夫曼树不唯一
具有n个叶结点的哈夫曼树必有 2n-1个结点
![Page 21: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/21.jpg)
霍夫曼树性质
霍夫曼树不唯一 霍夫曼树中没有度为 1 的结点 叶子结点个数为 n 的霍夫曼树的总的结点个数
是 :2n-1
![Page 22: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/22.jpg)
例
已知某系统在通信联络中只可能出现八种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,
试设计哈夫曼编码。
![Page 23: 第九章 堆与优先队列](https://reader033.fdocuments.net/reader033/viewer/2022061412/568150c0550346895dbee163/html5/thumbnails/23.jpg)
0.05, 0.29, 0.07, 0.08, 0.14, 0.23, 0.03, 0.11
0.03 0.05
0.11
0.23 0.29
0.14 0.15
0.07 0.08
0 1
0 1
0
0
0
0
0
1
1
1
1
1