数据结构 第十章 优先级队列(完全二叉堆 左式堆)

数据结构 第十章 优先级队列

  • 基本实现
  • 完全二叉堆 结构
  • 完全二叉堆 插入与上滤
  • 完全二叉堆 删除与下滤
  • 完全二叉堆 批量建堆
  • 堆排序
  • 左式堆

基本实现

循优先级访问:按照任务的优先级来决定任务的处理顺序
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第1张图片
使用向量实现太复杂,使用二叉树实现又是杀鸡用牛刀

完全二叉堆 结构

完全二叉树:最底层右侧缺失某些结点
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第2张图片
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第3张图片
逻辑上,与完全二叉树的元素对应;物理上,借助向量的力量实现,逻辑结点与向量的层次遍历彼此对应,将这种实现方法称作完全二叉堆
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第4张图片
堆序性:数值上,任何结点不得超过它的父亲
注,上图中的数字是指在向量中的秩,而不是数值

完全二叉堆 插入与上滤

插入词条e,只需将e作为末元素接入向量,如果插入结点与其父亲违背堆序性,则交换该节点与父亲,交换过后若还是违背堆序性,则继续交换,该结点一直向上交换,称为上滤

完全二叉堆 删除与下滤

完全二叉堆的元素读取只限于获得最大元或者删除最大元,删除以后若违背堆序性,则与其比它大的孩子交换位置

完全二叉堆 批量建堆

对于任何n个元素,将其构建成一个完全二叉堆
1.自上而下的上滤法建堆
为蛮力方法,每插入一个元素,都对其进行一次上滤操作。最坏情况下,每个结点都需要上滤至根结点,所需成本线性正比于所有结点的深度和
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第5张图片
2.自下而上的下滤建堆
合并两个子堆,只需要将其父结点做一次下滤,根据此原理,从最底层开始往上,对各个内部结点(非叶子结点的结点)做一次下滤,从而构建完全二叉堆
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第6张图片

堆排序

S1:建堆,根据Floyd算法,即自上而下的下滤方法把待排序的向量建成完全二叉堆
S2:选取+调整 选取堆顶与末元素互换位置,再把这个末元素从堆中删除并加入已排序序列,再对新的根结点做一次下滤调整,如此循环
时间复杂度为O(nlogn)
空间复杂度为O(1)
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第7张图片
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第8张图片

左式堆

左式堆用于高效的合并
单侧倾斜:结点分布偏向于左侧,合并操作只涉及右侧
在堆中引入外部结点,消除所有的一度结点,将堆转化为真二叉树
npl(空节点路径长度):npx(x)=x到外部结点的最近的距离
数据结构 第十章 优先级队列(完全二叉堆 左式堆)_第9张图片
左倾:对于任意节点,npl(lc(x))≥npl(rc(x))
左倾堆:任意结点都左倾
左式堆合并:合并a和b两个堆,先将a的右孩子和b合并,然后再调整以恢复左倾性

你可能感兴趣的:(数据结构 第十章 优先级队列(完全二叉堆 左式堆))