优先队列知识点

在STL里有这个priority_queue,实现优先队列的结构。在优先队列中,优先级高的元素先出队列。


优先队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除。在最小优先队列(min priorityq ueue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行。
最大优先权队列的抽象数据类型描述如ADT 9-1所示,最小优先队列的抽象数据类型描述与之类似,只需将最大改为最小即可。

抽象数据类型M axPriorityQueue
有限的元素集合,每个元素都有一个优先权操作
C reate ( ):创建一个空的优先队列

Size ( ):返回队列中的元素数目

Max ( ):返回具有最大优先权的元素
I nsert (x):将x插入队列
DeleteMax (x):从队列中删除具有最大优先权的元素,并将该元素返回至x;

其实就三种用法
第一种,直接使用默认的。
它的模板声明带有三个参数,priority_queue<Type, Container, Functional> Type 为数据类型, Container 为保存数器,Functional 为元素比较方式。 Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list. STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个 参数缺省的话,优先队列就是大顶堆,队头元素最大。 看例子
 

priority_queue<int> qi;
int a[len] = {3,5,9,6,2}; 

priority_queue<int> qi;
for(i = 0; i < len; i++)
    qi.push(a[i]); 

for(i = 0; i < len; i++)     
{
    cout<<qi.top()<<" ";        
    qi.pop();    
} 


通过<操作符可知在整数中元素大的优先级高。 故例子中输出结果为:9 6 5 3 2 第二种:
第二种方法:
在示例1中,如果我们要把元素从小到大输出怎么办呢?
这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。 如果要用到小顶堆,则一般要把模板的三个参数都带进去。 STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆 priority_queue<int, vector<int>, greater<int> >qi2; 对于自定义类型,则必须自己重载 operator< 或者自己写仿函数

 

#include <iostream> 
#include <queue> 
using namespace std; 
struct Node{     
    int x, y;
    Node( int a= 0, int b= 0 ):         
        x(a), y(b) {} 
    };
bool operator<( Node a, Node b )
{     
    if( a.x== b.x ) 
        return a.y> b.y;     
    return a.x> b.x;  
}
int main(){
    priority_queue<Node> q;     
        for( int i= 0; i< 10; ++i )
            q.push( Node( rand(), rand() ) );     
        while( !q.empty() )
        {
            cout << q.top().x << ' ' << q.top().y << endl;         
            q.pop();     
        }     
        getchar();     
        return 0; 
} 

或者这样定义也是能达到效果的:

 struct Node{     
     int x, y;
     Node( int a= 0, int b= 0 ):         
         x(a), y(b) {}
         friend operator<( Node a, Node b )
         {     
             if( a.x== b.x ) 
                return a.y> b.y;     
             return a.x> b.x;     
         } 
}; 

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。 但此时不能像基本类型这样声明 priority_queue<Node, vector<Node>, greater<Node> >; 原因是 greater<Node> 没有定义,如果想用这种方法定义 则可以按如下方式 例子:

#include <iostream> 
#include <queue> 
using namespace std; 
struct Node{     
    int x, y;
    Node( int a= 0, int b= 0 ):         
        x(a), y(b) {} 
    };
struct cmp{
    bool operator() ( Node a, Node b ){
        if( a.x== b.x ) 
            return a.y> b.y;         
        return a.x> b.x; 
    } 
};

int main(){
    priority_queue<Node, vector<Node>, cmp> q;     
    for( int i= 0; i< 10; ++i )
        q.push( Node( rand(), rand() ) );     
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;         
        q.pop();     
    }     
    getchar();    
    return 0;
}
还有一点要注意的是priority_queue中的三个参数,后两个可以省去,因为有默认参数,不过如果,有第三个参数的话,必定要写第二个参数。
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的优先队列是一种特殊的队列数据结构,其中每个元素都有一个与之关联的优先级。优先级高的元素先被处理,而优先级相同的元素按照它们被插入的顺序进行处理。 在C语言中,可以使用以下几种方式来实现优先队列: 1. 数组实现:使用数组来存储元素,并根据元素的优先级进行排序。插入元素时,需要按照优先级找到合适的位置进行插入;删除元素时,直接删除数组中的第一个元素即可。这种实现方式简单直观,但插入和删除操作的时间复杂度较高。 2. 堆实现:使用堆这种数据结构来实现优先队列。堆是一种完全二叉树,满足堆序性质:对于每个节点i,其父节点的值小于等于节点i的值。在C语言中,可以使用数组来表示堆。插入元素时,将元素插入到堆的末尾,并通过上浮操作将其调整到合适的位置;删除元素时,将堆顶元素与最后一个元素交换,并通过下沉操作将其调整到合适的位置。这种实现方式的插入和删除操作的时间复杂度为O(log n),效率较高。 3. 链表实现:使用链表来存储元素,并根据元素的优先级进行排序。插入元素时,需要按照优先级找到合适的位置进行插入;删除元素时,直接删除链表中的第一个元素即可。这种实现方式相对于数组实现来说,插入和删除操作的时间复杂度较低,但查找操作的时间复杂度较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值