数据结构------堆(一、从优先队列引出堆)

一、什么是优先队列

   优先队列,顾名思义,其实就是一个队列。但是它与普通的队列还是有很大的不同。众所周知,普通的队列都遵循先进先出的原则,而优先队列与它不同的地方就是优先队列不一定就是先进先出,出队顺序是由每个元素的优先级来决定的。

二、为什么使用优先队列

   举个例子,像我们的操作系统的任务管理器,它就是根据每个任务的优先级来分配cpu时间片,它是一个动态的调度。为什么说是动态呢?因为在我们的操作系统中,不可能只有固定数量的任务,比如在一个任务完成之后,很可能接下来就会有很多的任务入队等待执行,所以在调度任务的时候,就会动态的根据每个任务的优先级来处理它们。就像在医院中,医生不可能把一整年的手术都已经排好了,因为每天的病人和情况都是不一样的,所以医生就会根据每个病人的紧急情况来进行治疗。

三、如何实现优先队列

   对于优先队列,本质上就是一个队列,它实现的就是队列的接口,所以它具有的方法和普通的队列是一样的。但是不一样的是,它的每次出队和获取队首元素的值都是优先级最高的,也可以说是最大的值。那么我们用什么来实现它的底层结构呢?

   我们首先想到的就是线性的数据结构,比如数组或者链表等等。因为对于普通队列,我们就是使用线性数据结构来实现的,它仅仅是把数据存进去,然后实现方法的逻辑来达到它的作用即可。

   如果使用数组或者链表来实现,那么我们主要考虑的就是它的入队和出队的时间复杂度。入队时,它的时间复杂度就是O(1)级别的。因为它只是把数据存入即可,因为我们只是在出队时将优先级最高的元素出队,并不需要管它内部的顺序。而出队时,因为要将优先级最高的元素出队,所以我们就需要将所有的元素都比较一遍,找出其中的最大值才可以出队,所以它出队的时间复杂度就是O(n)级别的,所以综合来看,使用线性数据结构时它的时间复杂度就是O(n)级别的。

   我们还可以使用顺序数据结构来实现优先队列,因为在上面提到线性数据结构的出队复杂度是O(n)级别的,那么如果使用顺序数据结构,它的出队复杂度就是O(1)级别,因为在它内部已经将所有元素的顺序都排列好了,但是这就将入队时的复杂度变成了O(n)级别了,原因是每一次元素入队时,都要与队列中的所有元素相比较,然后才可以知道自己在什么位置。所以综合来看顺序线性结构的时间复杂度也是O(n)级别的。

   那么我们到底应该用什么数据结构才能提高我们的效率呢?这就引出了我们的堆。

   其实,堆的底层是一个树形结构。我们都知道,树形结构的时间复杂度是O(logn)。这一时间复杂度比O(n)提高了很大的效率,那么我们如何来实现堆呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值