一.概念
在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。 这种数据结构就是优先级队列(Priority Queue)
二.优先级队列的实现方式——堆
三.操作
1.入队列(以小堆为例)
<1.将数组元素以尾插插入数组中
<2.比较其与双亲结点的值,比他大 则不动;比他小,进行交换
<3.持续进行上述操作 直至到达根结点
代码:
public void offer(int i) {
array[size++]=i;//因为插入元素的下标位置为数组末尾即size处,且插入后size需要加加
shiftUpSmall(array,size-1);
}//入队 插入元素 当前的堆尾 进行小堆的向下调整
2.出队列(以小堆为例)(是删除元素)
<1.因为直接将树顶元素出的话,剩下的树不会平衡 所以需要进行交换
<2.将当前树顶与树的最后一个元素进行交换,再对新的树顶进行向下的小堆调整
代码:
public int poll(){
int element=array[0];
array[0]=array[--size];//先减减 在使用 获取当前队尾下标 出队之后整体元素数减1
Heap.shiftDownSmall(array,size,0 );//使用小堆来建立新堆
return element;
}//出队
//将当前堆的最后一个元素与要出堆的元素(堆顶)进行交换 输出
//对当前堆顶进行小堆向下调整
3.返回队首元素(直接返回即可)(不用删除)
代码:
public int peek(){
return array[0];
}//返回队首元素(不删除)
四.错误处理的两种不同的返回值
错误处理 抛出异常 返回特殊值
入队列 add(e) offffer(e)
出队列 remove() poll()
队首元素 element() peek()
五.TOPK问题(重点)
TOPK问题(从海量数据中找到k个最大的)
操作:从数组中取k个元素,建立一个小堆。堆顶为这几个数 中最小的元素,将数组中的剩余元素依次与其比较,比堆顶小的元素坑定比堆内所有元素都小,如果大于堆顶 则取代当前堆顶,并进行小堆的调整。持续直至最后一个元素
伪代码:
heap[k]=createHeapBig(arr[1,k]);
for(i=k+1;i<array.length;i++){
shiftDownSmall(heep[k],array.length-k,arr[i]);
}
returnheap[k];