堆与优先队列

 堆的定义:n个元素的序列 {k1, k2, ..., kn} 称之为堆,当且仅当满足一下条件时:

(1)  \bg_white _{ki}  \geq  _{k2i}  且  _{ki}  \geq  _{k2i+1}  或  (2)  _{ki}  \leq  _{k2i}  且  _{ki}  \leq  _{k2i+1}    \left ( 1 \leq i \leq \left \lfloor \right n/2 \rfloor \right )

 堆的存储:我们用一维数组来存储堆

 堆的性质:堆实质上是满足如下性质的完全二叉树:树中所有非终端节点的值均不大于(或不小于)其左右孩子结点的值

 堆的示例:

      堆与优先队列_第1张图片          堆与优先队列_第2张图片

           大根堆                      小根堆

 堆的调整:从r[2s]和r[2s+1]中选出关键字较大者,假设r[2s]的关键字较大,比较r[s]和r[2s]的关键字

                      1.若r[s].val >= r[2s].val,无需做任何调整

      2.若r[s].val < r[2s].val,交换r[s]与r[2s],若以r[2s]为根的子树不是堆,重复上述过程,将以r[2s]为根的子树调整为堆

       直至进行到叶子结点为止

      这就是调整堆的方法:筛选法

 堆的建立:在一棵完全二叉树中利用筛选法,从最后一个分支结点floor(n/2),...,1的结点作为根的子树都调整为堆即可


 优先队列:基于普通队列的基本操作,优先队列都有,只不过每次出队的都是优先级最大的那个元素,在它的内部逻辑中是用

      是用堆实现的


 相关题目题解链接:

 https://blog.csdn.net/weixin_41602489/article/details/99568927

 https://blog.csdn.net/weixin_41602489/article/details/99585503

你可能感兴趣的:(数据结构与算法)