优先队列

一、概念

    1.定义

            优先队列是一种特殊的队列,作为缓存结构,它和队列、栈类似,都可以将元素保存其中,再按照一定的顺序访问和弹出。优先队列的特点在于不按照进队的次序决定出队次序,而是按照我们逻辑设定的优先级来决定出队的次序。

    2.分类

            

二、底层结构

    实现优先队列的方式有很多,二叉堆、二项堆、斐波那契堆等等,但这些都是堆的实现方式。事实上,优先队列也可以使用不同的底层结构实现(见下图),可以看到综合性能最优的还是使用堆这种数据结构。
            
            


三、二叉堆(binary heap)

    1、概念

            

    2、存储结构

            
            
              
                

    3、用二叉堆实现优先队列

                (1)抽象数据类

                            注意:capacity是数组的容量,size是当前数组中有效元素的个数,heap为数组
                            

                (2)插入操作

                            
                            
                                    
                                     
                                
                                

                (3)删除操作

                                
                                
                                
                                
                                
                                
                                
                                

四、优先队列的应用

    

1、应用场景举例

    

2、编程题举例

    数组出现频率问题:
        
            
            
vector<int> topKFrequent(vector<int> nums , int k)
{
    unordered_map<int,int> map;
    for(int i: nums) map[i]++;//遇见相同的键值对应的value就++,这样通过foreach语句遍历nums数组后就可以将不同元素出现的频次记录在map中
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;//声明一个最小堆
   for(auto it:map)
   {
       if(q.size() == k)
       {
           if(it.second > q.top().first)
           {
               q,pop();
               q.push(make_pair(it.second,it.first));
           }
       }
       else 
           q.push(make_pair(it.second,it.first));
   }
   vector<int> ans;
   while(q.size())
   {
       ans.push_back(q.top().second);
       q.pop();
   }
   return vector<int>(res.rbegin(),res.rend());
    //反向迭代器
}

五、c++STL库中的priority_queue

    

    1、基本参数设置

        

    

    2、小顶堆

        
        
#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
        else return a.x > b.x;
    }
}

void test()
{
    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();
    }
    
}

    3.基本操作

        

    4、用pair做优先队列元素

        
        

    5、用自定义类型做优先队列元素

        
          
    
全部评论

相关推荐

牛客52811839...:有的hr就是这样啊,很正常。
点赞 评论 收藏
分享
机智的豹子有点心碎:UU我还在找工作还没找到,一直在搜简历怎么改,总结了这些: 1.SEO:简历根据每一个岗位定制化:使用这个岗位中所描述的工作的词,它要求什么技能就把自己的技能描述成什么样子,把SEO用在自己身上(把我的简历和个人特质,当成一个热门产品来做 “搜索引擎优化”),让HR能用最低的门槛看到我 2."顺序:把岗位要求的技能跟经历放在简历的最开头、最显眼的位置" 3.包装:简历是一个最终交付说明书,只要最终学习成长做得到就可以,在合适的范围内自我吹捧(我这个人怎么能够在HR的角度被迅速的看懂和看到,减轻HR的工作压力) 4.每点加小标题​:用6~10字概括该段内容,便于面试官快速抓取信息。 5.避免空泛描述​:拒绝“培养了组织能力”等泛泛而谈,替换为具体行动和成果。 6."使用“三段式结构”​​:每段经历按“为什么做-做了什么-结果如何”展开: ​a) 为什么做​:痛点或目标(例如“品牌声量不足”) ​b) 做​了什么:方法论(例如“趋势洞察+竞品对标+人群细分”) ​c) 结果如何​:量化成果或影响(例如“推动客户投放20万预算”)" 7.量化成果​:用数字体现工作成效(如“整理500+份资料”“撰写2万字报告”)。 这些有的是我想去的岗的,如果对你有用的话按需修改就好~加油,早日上岸!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务