优先队列的特点

普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同:

  • 最大优先队列:优先级最高的元素先出队
  • 最小优先队列:优先级最低的元素先出队

优先队列可以用下面几种数据结构来实现:

  • 基于堆 heap,包括下面几种堆:

    • 二叉堆
    • 多项式堆
    • Fibonacci 堆
  • 基于二叉搜索树 BST

如果用线性数据结构来实现优先级队列,则时间复杂度均为 O(n)。而如果用二叉堆来实现,时间复杂度可以提高到 O(logn)。下面以二叉堆为例。

实现二叉堆

二叉堆有两个限制:

  • 二叉堆必须是完全二叉树(元素从上而下,自左至右排列)
  • 二叉堆中任一父结点的值大于其左右两子节点的值(大顶堆,可以实现最大优先队列),或小于其左右两子节点的值(小顶堆,可以实现最小优先队列)

根据二叉堆上面的性质,可以用一个数组来保存二叉堆中的结点。其中,对于数组中任一个秩为 x 的元素,其对应二叉树中,父子结点的秩分别为:

  • 父结点:r = (x - 1) /2
  • 左子结点:r = 2x +1
  • 右子结点:r = 2x + 2

二叉堆的构建,可以参考 这里。

转载于:https://www.cnblogs.com/kika/p/10851495.html

【算法与数据结构】二叉堆和优先队列 Priority Queue相关推荐

  1. 【数据结构与算法拓展】二叉堆原理、实现与例题(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  2. 42. 盘点那些必问的数据结构算法题之二叉堆

    盘点那些必问的数据结构算法题之二叉堆 0 概述 1 二叉堆定义 2 保持堆的性质 3 建立最大堆 4 堆排序 5 优先级队列 参考资料 0 概述 本文要描述的堆是二叉堆.二叉堆是一种数组对象,可以被视 ...

  3. 关于二叉堆(优先队列)的其他操作及其应用

    [0]README 0.1)本文总结于 数据结构与算法分析:源代码均为原创, 旨在了解到我们学习了优先队列后,还能干些什么东西出来, 增加学习的interest: 0.2)以下列出了 关于二叉堆(优先 ...

  4. 0x17.基础数据结构 - 二叉堆

    目录 一.二叉堆 二.例题 0.AcWing 145. 超市 AcWing 146. 序列(POJ 2442) 三.HuffmanHuffmanHuffman树 1.AcWing 148. 合并果子 ...

  5. 理解至上:二叉堆与优先队列详细用法

    文章目录 二叉堆 概述 插入 代码 访问 代码 完整代码 优先队列:priority_queue 基本用法 小根堆的声明: 结构体 注意 Thanks for reading! 二叉堆 概述 为什么不 ...

  6. 二叉堆的优先队列基本原理及实现

    原理: 传统的队列是先进先出的数据结构,队列的重要变种称为优先级队列 二叉堆常见的遍体:最小堆(其中最小的键在前面)和最大堆(其中最大的键值总是在前面) 代码实现

  7. [0x17基本数据结构-二叉堆]-Supermarket

    题意: 超市里有N件商品,每件商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品不能再卖.求合理安排每天卖的商品的情况下,可以得到的最大收益是多少. 输入格式: 输入包含多组测试用例. 每组 ...

  8. 二叉堆与自定义优先队列实现删除任意元素

    二叉堆与自定义优先队列实现删除任意元素 堆Heap 二叉堆Binary Heap 二叉堆 二叉堆的实现 插入(insert) 取出堆顶(extract / delete max) 优先队列(Prior ...

  9. 排序算法之——优先队列经典实现(基于二叉堆)

    许多应用都需要处理有序的元素,但有时,我们不要求所有元素都有序,或是一定要一次就将它们排序,许多情况下,我们会收集这些元素里的最大值或最小值. 这种情况下一个合适的数据结构应该支持两种操作:插入元素. ...

  10. 数据结构之优先队列--二叉堆(Java实现)

    前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...

最新文章

  1. fatal: No configured push destination
  2. c 5.6 mysql 配置文件_Windows系统中MySQL 5.6的配置文件(my.ini)修改方法_MySQL
  3. IDEA下搜狗输入法输入中文时卡着不动的参考解决方法
  4. 微信消息提醒与消息数字提示之BadgeView
  5. Java 8 Optional不仅用于替换空值
  6. 已设置的指纹解锁怎样解除_指纹锁哪个牌子更好用?
  7. .Net程序猿玩转Android开发---(11)页面跳转
  8. java bit mask_位掩码(Bit Mask)的应用
  9. GEO hash 核心原理
  10. 达梦数据库SQL语法
  11. 未来教育mysql下载_未来教育计算机二级题库中的视频为什么无法播放
  12. mysql数据对比_MySQL--如何快速对比数据
  13. 小a的旅行计划(BM模板)
  14. 电子计算机出现的背景,世界第一台电子计算机产生的背景是什么
  15. 【题解】P2627 [USACO11OPEN]Mowing the Lawn G
  16. 华为云 - 在华为云主机上部署宝塔6.x面板
  17. MFC之对于文档类的DeleteContents和OnNewDocument说明29
  18. Representation Learning 表示学习(简单笔记)
  19. Linux 内核中RAID5源码详解之守护进程raid5d
  20. java利用Scanner获取键盘输入

热门文章

  1. 在sqlyog中创建MySQL触发器简单实例
  2. NP、OSPF路由聚合
  3. Linux桌面图形化安装详解
  4. iStack与CSS配置实例
  5. SpringCloud-Zuul(二):自定义Filter及内部路由源码解析
  6. 设计与实现分离——面向接口编程(OO博客第三弹)
  7. Java开发工具(Eclipse工作空间的基本配置)
  8. 转:面试题收集——Java基础部分(一)
  9. MyEclipse发布项目更改项目名
  10. 前端开发中一些常用技巧总结