【问题描述】
使用最小化堆实现一个整型的优先队列,实现下列功能:
insert x,将优先级值为x的元素入队
find x,找出优先级值大于x的最小的元素,输出其下标。如果有多个元素优先级值相同输出下标最小的那个。
decrease i v,将第i个节点的优先级值减少v。
【输入形式】
第一行含有一个正整数M(1<=M<=20000),代表总的操作数。
以下M行,每行一个操作。
【输出形式】
对于每个find操作,输出一个下标。回车分隔。
【样例输入】
9
insert 5
insert 6
insert 7
find 5
find 6
decrease 1 3
decrease 2 5
decrease 3 5
find 1
【样例输出】
2
3
2
【样例说明】
输入数据保证合法
find操作只要求时间复杂度O(n),其他操作要求O(logn)
思路
利用二叉堆实现优先级队列,注意由于二叉堆是完全二叉树,因此用数组顺序存储,在写题过程中的find函数,要从最后开始找,否则会失败。
#include <iostream>
using namespace std;
template <class Type>
class priorityQueue{
public:
int maxsize;
int currentLength;
void doubleSpace();
void buildHeap(){
for (int i=currentLength/2; i>0; i--) percolateDown(i);
}
void percolateDown(int hole);
void percolateUp(int hole);
public:
Type *array;
priorityQueue(int capacity=100){
array = new Type[capacity];
currentLength=0;
maxsize=capacity;
}
priorityQueue(const Type item[],int size);
~priorityQueue(){
delete[] array;};
bool isEmpty()const{
return currentLength==0;}
void enQueue(const Type &x);
void print