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