栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STL之优先级队列(priority

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STL之优先级队列(priority

前言

最近在刷算法题的时候遇到了需要使用堆来解决的问题(尤其是TOP k 问题),所以想把这些方法总结一下,防止后面忘记了还得到处找资料。希望能帮助到大家
参考链接1
参考链接2

堆(heap)的介绍

对通常是一个可以被看做一棵树的数组对象,满足两个条件:1,堆中的某个结点的值总是不大于或者不小于其父结点的值 2,堆是一颗完全二叉树
根结点最大的数叫做大根堆,最小的叫做小根堆。
堆排序中建堆的时间复杂度为O(n)
在C++ STL中没有堆的数据结构,所以借助其中的 priority_queue(默认是大根堆)

priority_queue

常用的方法如下:

priority_queue, 优先队列,默认是大根堆
    size()
    empty()
    push()  插入一个元素
    top()  返回堆顶元素
    pop()  弹出堆顶元素
    定义成小根堆的方式:priority_queue, greater> q;
priority_queue使用
  1. 定义:priority_queue ,priority_queue属于是容器适配器,需要指定底层的容器,所以第一个参数Type是queue里面存的数据的类型,第二个参数Container是要使用的底层容器(一般是vector),Functional 就是比较的方式.
  2. 当数据是基本数据类型时可以使用默认的比较方式,使用如下:
//升序队列
priority_queue ,greater > q;
//降序队列
priority_queue ,less >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。
//其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
当使用自定的数据类型时,比较方式的写法
  1. lambda函数(如果有不清楚的可以参考我的这篇文章:c++11新特性)
auto cmp = [](pair left, pair right) -> bool { return left.second > right.second; };
priority_queue, vector>, decltype(cmp)>  pri_que(cmp);
  1. 仿函数实现(最常用)
class mycomparison {
public:
    bool operator()(const pair& left, const pair& right) {
        return left.second > right.second;
    }
};
priority_queue,vector>,mycomparison> pri_que2;
  1. 在自定义类型的类或者结构体中,重载运算符
struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; //大顶堆
    }
}
priority_queue pri_que3;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018175.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号