优先队列总结

优先队列用于高效处理具有优先级的事件调度,包括删除最大值和插入操作。文章介绍了初级实现,如使用数组和选择/插入排序,但时间复杂度较高。为优化操作,引入了二叉堆,确保操作时间复杂度为logN。二叉堆是一种堆有序的完全二叉树,支持删除最大值和插入新值。当需要访问中间元素时,提出了索引优先队列的概念。此外,还讨论了堆排序,即通过构造堆然后不断删除最大值实现排序。文章提供了相关的堆操作和代码实现。
摘要由CSDN通过智能技术生成

优先队列

引入

在生产调度中,事件都有优先级,那么如何快速的调度最高优先级的事件成为一件需要考虑的事情。调度中有两种操作,第一种是调度最高级事件,第二种是插入事件,那么优先队列这种数据结构完美解决了这两个操作,在优先队列中这两种操作完成的任务就是删除队列中最大值和插入新值。

优先队列初级实现

那么优先队列如何实现呢?简单的可以用数组来实现,有以下两种方法:
1.数据插入随意,数据是无序的,删除时利用选择排序中的一次内循环找出最大值并删除。
2.数据插入时利用插入排序进行插入,数据是有序的,删除时直接删除最右端的值便可以。
那么这样实现的优先队列操作的时间复杂度怎么样呢?

方式 插入元素 删除最大元素
无序 1 M(最坏情况为N)
有序 M(最坏情况为N) 1

二叉堆引入

由于初级实现的优先队列的两种操作时间复杂度在N较大时效果不好,引入了二叉堆的数据结构,两种操作的数量级均可以达到logN。

概念

堆有序:树中的每个节点均大于等于它的两个子节点。
完全二叉树:除最深一层外其他层节点均达到最大值,且最深一层连续集中在左边的二叉树(完全二叉树可以与数组一一对应)
二叉堆:一组能够用堆有序的完全二叉树排序的元素,并在数组中按层级存储。
二叉堆实例:

这里写图片描述

堆操作

删除堆中的最大值:将根节点删除,并将最末尾元素放至根节点,然后将该元素进行下沉操作。
插入新值:插入至末尾,并将该元素进行上浮操作
下沉操作代码:

void sink(int k)
{
    while(2*k<=N){
        int j=2*k;
        if(j<N&&less(j,j+1)) j++;
        if(!less(k,j)) break;
        exch(k,j);
        k=j;
    }
}

上浮操作代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值