最小化堆实现优先队列

该博客介绍如何利用最小化堆实现一个整型优先队列,详细讲解了包括插入、查找和降低优先级等操作,并给出了具体的输入输出样例及思路解析,强调find操作需从数组末尾开始查找以满足O(n)的时间复杂度要求。
摘要由CSDN通过智能技术生成

【问题描述】

使用最小化堆实现一个整型的优先队列,实现下列功能:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值