




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、堆优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是 依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。问题:如何组织优先队列?一般的数组、链表?有序的数组或者链表?二叉搜索树? AVL树?若采用数组或链表实现优先队列数组 : ( 1 ) ( n ) O( n ) 元素总是尾部删除 查找最大(或最小)关键字从数组中删去需要移动元素链表: ( 1 ) ( n ) ( 1 ) 元素总是链表的头部删除 查找最大(或最小)关键字删去结点有序数组:O( n ) 或 O(log2 n )O( n ) ( 1 )找到合适的位置移动元素并删去最后一个元素删除 有序链表: O
2、( n ) ( 1 ) ( 1 )找到合适的位置元素删除首元素或最后元素删除 是否可以采用二叉树结构?二叉搜索树?如果采用二叉树结构,应更关注树结点顺序怎么安排?树结构怎样?还是删除?优先队列的完全二叉树表示abcgdefih堆的两个特性结构性:用数组表示的完全二叉树;有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)“最大堆(MaxHeap)”,也称“大顶堆”:最大值 “最小堆(MinHeap)”,也称“小顶堆” :最小值01234567891011abcdefghi【例】最大堆和最小堆303833【例】不是堆30注意:从根结点到任意结点路径上结点序列的有序性!堆的抽象数据类型描述
3、类型名称:最大堆(MaxHeap)数据对象集:完全二叉树,每个结点的元素值不小于其子结点的元素值操作集:最大堆H MaxHeap,元素item ElementType,主要操作有:MaxHeap Create(MaxSize ):创建一个空的最大堆。IsFull( MaxHeap H ):判断最大堆H是否已满。Insert( MaxHeap H, ElementType item ):将元素item最大堆H。IsEmpty( MaxHeap H ):判断最大堆H是否为空。ElementType DeleteMax( MaxHeap H ):返回H中最大元素(高优先级)。最大堆的操作最大堆的创建
4、typedef struct HeapStructstruct HeapStruct 把MaxData换成 小于堆中所有元素的 MinData,同样适用于创建最小堆。*MaxHeap;ElementType *Elements; /*/堆元素的Size; Capacity;/* 堆的当前元素个数/* 堆的最大容量;MaxHeap Create(MaxSize )/* 创建容量为MaxSize的空的最大堆 */MaxHeap H = malloc( sizeof( s ruct HeapStruct ) );H-Elements = malloc( (MaxSize+1) * sizeof(El
5、ementType); H-Size = 0;H-Capacity = MaxSize;H-Elements0 = MaxData;/* 定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作 */return H;最大堆的1 58232544316184105Case 1 :new_item = 2020313531584458 Elements0已经定义为哨兵 */i;if ( IsFull(H) ) prf(最大堆已满); return;i = +H-Size; /* i指向后堆中的最后一个元素的位置 */for ( ; H-Elementsi/2 Elementsi = H-Elem
6、entsi/2; /* 向下过滤结点 */ H-Elementsi = item; /* 将item*/算法:将新增结点到从其父结点到根结点的有序序列中哨兵:100020T (N) = O ( log N )151286void Insert( MaxHeap H, ElementType item ) /* 将元素item最大堆H,其中H-Eleme为哨兵 */i;H-Element 0 是哨兵元素,if ( IsFull(H) ) 它不小于堆中的最大元素,prf(最大堆已满);控制顺环结束。return;i = +H-Size; /* i指向后堆中的最后一个元素的位置 */for ( ;
7、H-Elementsi/2 Elementsi = H-Elementsi/2; /* 向下过滤结点 */ H-Elementsi = item; /* 将item*/最大堆的删除取出根结点(最大值)元素,同时删除堆的一个结点。把 31 移至根441232535找出31的较大的孩子4425Elements1; /* 取出根结点最大值 */* 用最大堆中最后一个元素从根结点开始向上过滤下层结点temp = H-ElementsH-Size-;*/for( Parent=1; Parent*2Size; Parent=Child ) Child = Parent * 2;if( (Child!=
8、H-Size) &(H-ElementsChild ElementsChild+1)Child+; /* Child指向左右子结点的较大者 */if( temp = H-ElementsChild ) break;)/* 移动temp元素到下一层 */elseH-ElementsParent = H-ElementsChild;H-ElementsParent = temp;return MaxItem;最大堆的建立建立最大堆:将已经存在的N个元素按最大堆的要求存放在一个一维数组中方法1:通过操作,将N个元素一个个相继到一个初始为空的堆中去,其时间代价最大为O(N logN)。方法2:性时间复杂度下建立最大堆。将N个元素按输入顺序存入,先满足完全二叉树的结构特性调整各结点位置,以满足最大堆的有序特性。考虑结点当前考虑结点当前考虑结点794366837373202020873891955373702024499当前考虑结点当前考虑结点当前考虑结点779918798139873972484733866999554449333091线性时间复杂度T(n)=O(n)8783结点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 员工合同调转协议
- 民宿合作协议书合同模板
- 哈尔滨装修合同协议
- 商场陪玩服务合同协议
- 品牌授权协议合同协议
- 商业办公室转让合同协议
- 商品期货交易合同协议
- 员工纪律协议书范本
- 咨询劳务费合同协议
- 忠诚协议书格式
- (四调)武汉市2025届高中毕业生四月调研考试 地理试卷(含答案)
- 海南省海口市(2024年-2025年小学五年级语文)统编版期中考试((上下)学期)试卷及答案
- 社会单位1234+N消防安全标准化管理达标评定标准
- 熔射(热喷涂工艺)
- 地质灾害防治培训教学课件
- 2022法考刑法历年真题答案及解析(一)
- 球形网架屋面板安装专项施工方案
- 2023年昆明安宁市广播电视台(融媒体中心)招聘笔试模拟试题及答案解析
- 整形美容医院5月营销活动政策方案
- 全文《中国式现代化》PPT
- 中国华电集团公司火电厂烟气脱硫工程(石灰石石膏湿法)设计导则(a版)
评论
0/150
提交评论