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

基本实现

循优先级访问:按照任务的优先级来决定任务的处理顺序
在这里插入图片描述
使用向量实现太复杂,使用二叉树实现又是杀鸡用牛刀

完全二叉堆 结构

完全二叉树:最底层右侧缺失某些结点
在这里插入图片描述
在这里插入图片描述
逻辑上,与完全二叉树的元素对应;物理上,借助向量的力量实现,逻辑结点与向量的层次遍历彼此对应,将这种实现方法称作完全二叉堆
在这里插入图片描述
堆序性:数值上,任何结点不得超过它的父亲
注,上图中的数字是指在向量中的秩,而不是数值

完全二叉堆 插入与上滤

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

完全二叉堆 删除与下滤

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

完全二叉堆 批量建堆

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

堆排序

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

左式堆

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值