1.优先队列
(1)预备知识
①堆
堆就是一种特殊的二叉树。
其父节点比它的子节点大(或者小也可以)
(2)堆实现的优先队列好处
①每次增加一个新元素,维护一个最值元素。
最多需要logN此比较,logN此交换
②维护前N个大小的,不需要装下所有的元素,
可以用流读入,来一个判断一个。
(3)典型使用场景
①任何时候返回最值元素。
②数据量太大无法存入内存,而要找出一定的最值元素。
③合并若干不同来源的已排序的源。
(4)注意
①未知数量元素排序
一共未知数量元素,找出最大的10个。
一个一个inset构造一个大小为11的堆,
然后来一个inset一个,然后弹出一个最小的。
②固定数量元素排序
先装入数组。
sink掉一半,构造堆。
然后交换最后一个与第一个,再对现在的第一个sink,最后就排好序了。
2.索引优先队列
(1)预备知识
①索引
英文的表达式Index,索引优先队列就是在优先队列的基础上提供一个通过索引访问队列中元素的方式。
而一般的实现方式就是将插入队列中的顺序作为索引,通过索引可以找到元素在堆中的下标,再用这个下标就能访问到元素啦。
②平行数组
加入说有一种对象,它有3个属性,现在有N个这种对象。
A。你可以使用一个类的实例,或者一个结构体来表示这个对象,这样你只需要一个长度为N的类/结构体的数组就能表达所有的对象了。
B。同时你也可以使用一个数组来存储对象的一个属性,这样你使用3个长度为N的数组也能达到和A一样的效果。
B的这种方法就是平行数组。
平行数组的好处就是,一旦你只需要其中一个属性不必载入其他内容,这在缓存紧张的系统里很重要。
(2)为什么需要索引优先队列
①需要引用已经放入队列的元素是必要的
②本身数据就已经使用平行数组来存放了
(3)实现
①简单想法
pq是堆,下标是堆中位置,值是元素的值。
qp是索引数组,下标是插入顺序(即索引),值是该插入顺序的元素在堆中的位置
②实际实现
采用3个数组
pq,qp,key
pq是堆,下标是堆中位置,值是插入顺序(即索引)
qp是索引数组,下标是插入顺序(即索引),值是堆中位置
key是对象数组,下标是插入顺序(即索引),值是对象本身
注意:less是用key去比较
exch是交换位置,以及通过插入顺序到的堆中位置