数据结构——堆

本文介绍了堆这一数据结构,包括堆的定义、如何在物理和逻辑上转换,以及堆的核心操作——向下调整。接着,讨论了如何实现完全二叉树的建堆操作,并解释了如何用堆实现优先级队列,特别是在操作系统调度进程中的应用。最后,对比了数组和堆在实现优先级队列时的性能,并提出使用堆解决Top-K问题的高效策略。
摘要由CSDN通过智能技术生成

1.堆的定义 

          堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树(逻辑层面上)的数组对象(物理层面上),常用来在一组变化频繁(发生增删查改的频率较高)的数据中寻找最值.将根结点最大的堆叫做最大堆或大根堆,这样可以找到堆中的最大值(根节点的值);根结点最小的堆叫做最小堆或小根堆,这样可以找到堆中的最小值。

2.堆在物理上和逻辑上的相互转换

3.堆的核心操作——向下调整

        要实现向下调整,需要满足的前提是:针对某个结点(某个下标)进行向下调整时,除了该结点和其左右孩子之外,该完全二叉树的其余部分应该确保已经满足堆的性质.

堆的性质:

(1) 堆中某个结点的值总是不大于或不小于其父结点的值;

(2) 堆总是一棵完全二叉树。

❤向下调整的具体操作步骤(假设构建的堆是小堆):

(1)明确要调整结点的下标位置是不是叶子结点的下标,如果是叶子结点,操作结束;反之,继续下一步操作;

(2)标记要调整结点的左右两个孩子的值,找到其中的最小值(因为这棵树是一棵完全二叉树,所以不可能出现有左孩子没有右孩子的情况).该结点只有左孩子,没有右孩子,所以最小值的下标可以直接设置为左孩子的下标.

(注:左右孩子的下标都需要小于size,否则会越界.如果结点的左孩子的下标>=size,说明该结点是叶子结点,反之该结点有孩子,不是叶子结点)

(3)将左右孩子的最小值与要调整结点的下标进行比较

结点的值 < = 孩子的最小值 ->在满足前提下,需要调整的位置也满足堆的性质,操作结束

结点的值 > 孩子的最小值 -> 进行下一步操作

(4)将结点和孩子的最小值进行交换

(5)判断交换之后,结点是否还满足堆的性质,如果不满足,继续执行第一步(1).(可以用循环来实现)

循环的两个出口:

(1) 要调整的结点是叶子结点;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值