我不得不感慨这次的此时题出的太好了,单调队列,优先队列,这些之前听过但不知道如何使用的数据结构现在已经学会原理并开始使用(虽然并不太熟练),接下来就来介绍一下这两种数据结构。
单调队列:这个东西折磨了我一整个自习课,单调队列的思路十分简单,我们拿一组数:5 2 7 4 3(是不是很眼熟),单调队列就是一种维护队列种元素顺序一直为有序(递增或递减),我们来模拟一下它的过程(以递增为例),先将5直接加入队列(因为是一号元素),在将2加入队列,我们发现2小于5,队列不再单调递增,我们便把前面所有大于2的数踢出,于是此时队列中只剩下2一个元素,加入7,并未改变队列增减性,再以此类推加入剩余元素。单调队列可以解决经典的窗口问题即给你一个区间去求区间的最大或最小值。至于实现,目前可参考的c语言实现太少(要去学c++了),我相信不久之后我就能将其填补上。
优先队列(堆):我想这是我今天最大的收获了,优先队列真的是一种很优秀的数据结构,它的实现简单,思路也很清晰并且可使用的范围也很广。优先队列的实质是一颗完全二叉树所以可以用数组实现,优先队列的作用就是维护一组数的最大值或最小值在堆顶(数组的首位),我们把这称为向下调整,具体是怎么实现的呢,我们看下图:
假如我要将堆顶的1输出并将其改成23,将1改成23并输出很简单但是这么做之后优先队列的结构被破坏了,23很明显不是这些数中的最小数那么应该怎么办呢,我们可以通过完全二叉树的性质去对比其的左右儿子节点将最小值与其交换位置,一直重复此过程知道回复优先队列性质为止,附上啊哈!算法的图话说明(就是那单调队列让我没时间去实现):
如果我只是单纯想加入一个新的节点呢,其实也很简单就只要将其插在队尾再比对他与父亲节点的关系就可以了(我们称为向上调整),也是附上图文:
今天的总结比较水,因为补题的单调队列真的折磨了我好久