• 用大顶堆和小顶堆实现优先队列


    大顶堆小顶堆(或大根堆小根堆)

    利用大顶堆实现优先队列,所谓大顶堆,容器内部元素是有序的,而且是按从大到小排序的(小顶堆刚好相反,从小到大)。容器只有一个出口一个入口,将元素放进去之后大顶堆会自动对其进行排序,大顶堆最大的元素放在对顶(小顶堆最小元素在对顶),堆顶元素弹出后,下一个最大(或最小)的元素作堆顶。

    c++的实现如下:

    1. //构造一个空的优先队列
    2. priority_queue<int>head;//(c++默认为大顶堆)
    3. //构造一个大顶堆
    4. priority_queue<int, vector<int>,less<int>> max_head;
    5. //构造一个小顶堆
    6. priority_queue<int, vector<int>,greater<int>>min_head;
    7. //第一个参数为要插入的元素类型,第二个参数为实现优先队列的底层容器,
    8. //第三个参数为比较规则,less为大顶堆的规则,greater为小顶堆,
    9. //系统自动实现,也可以自定义排序规则
    10. //后两个可以省略,第一个参数不能省略
    11. 自定义排序规则:
    12. static bool cmp(const pair<int,int>& a, const pair<int,int>& b) {
    13. return a.first == b.first ? (a.second - b.second) : (a.first - b.first);
    14. }
    15. priority_queueint,int>, vectorint,int>>,cmp>pri_que;
    16. //优先队列中存放的是一对整数,按照第一个元素升序排序,如果第一个元素相同比较第二个元素
    常见成员函数:
    boolemploy()

    返回值为true说明队列为空。

    intsize()

    返回优先队列里的元素数量。

    voidpop()

    删除队列顶部元素。

    inttop()

    返回队列顶部元素,但不删除该元素。

    voidpush(int value)

    将元素value插入队列中。

    java的实现方法:

    1. PriorityQueuehead = new PriorityQueue<>();//注意java默认是小顶堆
    2. //如果需要大顶堆需要自己提供比较器
    3. class MyCmp implements Comparator{
    4. @Override
    5. public int compare(Integer o1,Integer o1) {
    6. return o2 - o1;
    7. }
    8. }
    9. PriorityQueuehead = new PriorityQueue<>(new MyCmp);
      • 一些常用的方法:
      • booleanadd(E e)

        将指定的元素插入到此优先级队列中。

        voidclear()

        从此优先级队列中删除所有元素。

        booleancontains(Object o)

        如果此队列包含指定的元素,则返回 true

        Epeek()

        检索但不删除此队列的头,如果此队列为空,则返回 null

        Epoll()

        检索并删除此队列的头,如果此队列为空,则返回 null

        booleanremove(Object o)

        从该队列中删除指定元素的单个实例(如果存在)。

        intsize()

        返回此集合中的元素数。

        Object[]toArray()

        返回一个包含此队列中所有元素的数组。

    总结

    优先队列是一种比较重要的数据结构,可以以O(logn)的效率来增减元素,主要运用于排序。

  • 相关阅读:
    Maven 之 settings.xml文件详解
    文心一言 vs GPT-4 —— 全面横向比较
    day9-机器学习之pandas库学习
    Pandas-03(字符串与文本数据、索引和选择数据、统计函数、窗口函数)
    shiro回话管理
    指针和数组笔试题解析
    java毕业设计员工绩效考核系统分析与设计Mybatis+系统+数据库+调试部署
    精品Python协同过滤的新闻资讯推荐系统-可视化大屏
    centos7中多版本go安装
    CSS 样式优先级
  • 原文地址:https://blog.csdn.net/2201_76107580/article/details/134018902