优先队列(Priority Queue)

本文介绍了堆数据结构的基本概念,包括大顶堆和小顶堆的特点,以及如何通过二叉堆实现优先级队列。详细解释了 siftup 和 siftdown 的操作,并提供了构建堆的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆的基本概念

是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

Binary Heap

二叉堆是一个有堆排列的二叉树。
Root=A[0] R o o t = A [ 0 ]
Children(A[i])=(A[2i+1],A[2i+2]) C h i l d r e n ( A [ i ] ) = ( A [ 2 i + 1 ] , A [ 2 i + 2 ] )
Parent(A[i])=A[(i12)] P a r e n t ( A [ i ] ) = A [ ⌊ ( i − 1 2 ) ⌋ ]

sift up & sift down
    def siftDown(i):  // Also known as bubbleDown
    while A[i] has worse priority than one or both children:
       swap A[i], best child
       i = index of child we swapped with A[i]

    def siftUp(i):  // Also known as bubbleUp
        while i > 0 and A[i] has better priority than its parent:
        swap A[i], parent
        i = index of parent

删除最小值操作,取出后进行sift up和sift down即可,顺序无关。

make a heap
def makeheap():
    for i = n-1,n-2,...,2,1,0:
        siftDown(i)

使用sift down更快,因为可以保证接近根节点的元素不动,减少了操作。
总时间复杂度为O(n)

k-ary heap


k = m/n时效率最高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值