码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构--二叉堆与优先队列


    堆的一些性质

    1、堆是一颗完全二叉树

    2、堆的顶端一定是“最大”/最小”的,但是要注意一个点,这里的大和小并不是传统意义下的大和小,它是相对于优先级而言的.

    3.堆一般有两种样子,小根堆和大根堆,分别对应第二个性质中的“堆顶最大”“堆顶最小”,对于大根堆而言,任何一个非根节点,它的优先级都小于堆顶,对于小根堆而言,任何一个非根节点,它的优先级都大于堆顶
    在这里插入图片描述
    4、操作:

    插入一个元素

    取得最小(最大)的数值,并且删除
      
      能够完成这种操作的数据结构叫做优先队列

    而能够使用二叉树,完成这种操作的数据结构叫做堆(二叉堆)

    5、堆与优先队列的时间复杂度:

    若共有n个元素,则可在O(logn)的时间内完成上述两种操作

    优先队列

    STL中的优先队列就是采用大根堆来实现的。

    //优先队列需要头文件 
    #include<queue> 
    // 定义优先队列 
    priority_queue<结构类型> 队列名; 
    priority_queue <int> q; 
    priority_queue <double> d; 
    //优先队列的操作 
    q.size();//返回q里元素个数 
    q.empty();//返回q是否为空,空则返回1,否则返回0 
    q.push(k);//在q的末尾插入k 
    q.pop();//删掉q的第一个元素 
    q.top();//返回q的第一个元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    例1:合并果子

    less和greater优先队列

    priority_queue <int,vector<int>,less<int> > p; 
    priority_queue <int,vector<int>,greater<int> > q;
    
    • 1
    • 2

    less从大到小, greater是从小到大

    结构体优先队列

    要想使用结构体的优先队列, 需要在结构体内部重载小于号

    struct node 
    { 
      int x,y; 
      bool operator < (const node & a) const 
     { 
        return x<a.x; 
     } 
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    一个node 结构体有两个成员,x 和y ,它的小于规则是 x小者小。
    它也是按照重载后的小于规则,从大到小排序的。

    priority_queue <node> q;
    int main()
    {
      k.x = 10, k.y = 100; q.push(k);
      k.x = 12, k.y = 60; q.push(k);
      k.x = 14, k.y = 40; q.push(k);
      k.x = 6, k.y = 80; q.push(k);
      k.x = 8, k.y = 20; q.push(k);
      while (!q.empty())
     {
        node m = q.top(); q.pop();
        printf("(%d,%d) ", m.x, m.y);
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    程序大意就是插入 这五个node,再来看看它的输出:
    (14,40) (12,60) (10,100) (8,20) (6,80)
    就是按照 x从大到小排序的.
    例题2:最高的奖励

    课后练习

    1、卡车加油
    2、小b浇花

  • 相关阅读:
    【笔试强训】Day2
    无线传感器网络基于MCKP-MMF算法的流量估计matlab仿真
    python的公有和私有属性,方法的使用
    【云原生之K8S】k8s资源限制以及探针检查
    转载——比较器的原理
    【统计、图形和样本量软件】上海道宁为您提高强大的统计分析、图形和样本量工具
    百度校园招聘历年经典面试题汇总:开发测试岗
    艾美捷Abnova NEUROD6单克隆抗体(M17)说明书
    【场景化解决方案】深度融合钉能力,酷学院打造创新产品体验
    【快应用】车机加载器安装失败
  • 原文地址:https://blog.csdn.net/qq_32431299/article/details/125558192
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号