优先队列(堆)浅谈

1、概述

在分析堆之前,你可以理解一下队列和栈,其实他们都是对任务的一种调度策略,只是各自的准则不同罢了,队列为先进先出,栈为先进后出,而堆是每个任务分配了一个优先权,根据优先权进行任务的执行。调度程序通过堆始终能获取优先权最高的任务进行执行。比较常见应用为操作系统。

2、模型

堆又称为优先队列,其通常包括至少两种操作:insert(入队操作)和deleteMin(出队操作)。

3、实现方式

a.链表实现

简单链表的实现过程为在链表的头insert元素,使用O(1)时间完成,每次deleteMin元素,查找出链表中最小的元素,花费O(N)时间完成;另外一种方法是让链表保持有序状态,在进行任务insert的时候进行排序(花费O(N)),每次获取链表的头(花费O(1))。

b.二叉查找树实现

使用二叉查找树实现中,对于insert和deleteMin花费时间均为O(log(N)),但存在一个潜在问题,既是容易造成不平衡二叉树,因为deleteMin始终是从左边开始往右边进行删除。

c.二叉堆实现

二叉堆对于优先队列实现比较普遍,通二叉查找树一样,二叉堆具有两个性质:结构性和堆序性。
结构性:必须是一颗完全二叉树,树的插入从左到右,一颗完全二叉树的高度为小于log(N)的最大整数。
堆序性:二叉树的父节点必须小于两个子节点。
在二叉堆的具体实现中,通过一个数组来存储所有的元素,具体操作包括:
insert操作:在数组的最后位置添加该元素,然后再通过二叉堆的性质上虑新插入的元素,直到找到该元素的合适位置;
deleteMin操作:删除的元素为根元素,同时把数组最后元素赋值给根元素,根元素根据二叉堆的性质下虑,直到找到合适的位置。
buildHeap操作:对一组输入的数据进行构造堆,通过从下到上对非叶子节点进行下虑,所花费时间为O(N)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值