堆其实就是一种特殊的队列——优先队列。
普通的队列游戏规则很简单:就是先进先出;但这种优先队列搞特殊,不是按照进队列的时间顺序,而是按照每个元素的优先级来比拼,优先级高的在堆顶
这也很容易理解吧,比如各种软件都有会员制度,某软件用了会员就能加速下载的,不同等级的会员速度还不一样,那就是优先级不同呀。
还有其实每个人回复微信消息也是默默的把消息放进堆里排个序:先回男朋友女朋友的,然后再回其他人的。
这里要区别于操作系统里的那个“堆”,这两个虽然都叫堆,但是没有半毛钱关系,都是借用了 Heap 这个英文单词而已。
我们再来回顾一下「」在整个 Java 集合框架中的位置:

也就是说,

  • PriorityQueue 是一个类 (class);
  • PriorityQueue 继承自 Queue 这个接口 (Interface);

那 heap 在哪呢?
heap 其实是一个抽象的数据结构,或者说是逻辑上的数据结构,并不是一个物理上真实存在的数据结构。
heap 其实有很多种实现方式,比如 binomial heap, Fibonacci heap 等等。但是面试最常考的,也是最经典的,就是 binary heap 二叉堆,也就是用一棵完全二叉树来实现的。
那完全二叉树是怎么实现的?
其实是用数组来实现的!所以 binary heap/PriorityQueue 实际上是用数组来实现的。
这个数组的排列方式有点特别,因为它总会维护你定义的(或者默认的)优先级最高的元素在数组的首位,所以不是随便一个数组都叫「堆」,实际上,它在你心里,应该是一棵「完全二叉树」。
这棵完全二叉树,只存在你心里和各大书本上;实际在在内存里,哪有什么树?就是数组罢了。
那为什么完全二叉树可以用数组来实现?是不是所有的树都能用数组来实现?
这个就涉及完全二叉树的性质了,我们下一篇会细讲,简单来说,因为完全二叉树的定义要求了它在层序遍历的时候没有气泡,也就是连续存储的,所以可以用数组来存放;第二个问题当然是否。堆的特点

  1. 堆是一棵完全二叉树;
  2. 堆序性 (heap order): 任意节点都优于它的所有孩子
    a. 如果是任意节点都大于它的所有孩子,这样的堆叫大顶堆,Max Heap;
    b. 如果是任意节点都小于它的所有孩子,这样的堆叫小顶堆,Min Heap;

左图是小顶堆,可以看出对于每个节点来说,都是小于它的所有孩子的,注意是所有孩子,包括孙子,曾孙...

  1. 既然堆是用数组来实现的,那么我们可以找到每个节点和它的父母/孩子之间的关系,从而可以直接访问到它们。

比如对于节点 3 来说,

  • 它的 Index = 1,
  • 它的 parent index = 0,
  • 左孩子 left child index = 3,
  • 右孩子 right child index = 4.

可以归纳出如下规律:

  • 设当前节点的 index = x,
  • 那么 parent index = (x-1)/2,
  • 左孩子 left child index = 2*x + 1,
  • 右孩子 right child index = 2*x + 2.

有些书上可能写法稍有不同,是因为它们的数组是从 1 开始的,而我这里数组的下标是从 0 开始的,都是可以的。
这样就可以从任意一个点,一步找到它的孙子、曾孙子,真的太方便了,在之后讲具体操作时大家可以更深刻的体会到。
那有关堆的基本操作,以及为什么 heapify() 是 O(n) 的,我们之后再聊。

作者:是小齐呀
链接:https://juejin.im/post/6880291677651599367

优先队列默认是小顶堆吗_一分钟带你读懂什么是堆?相关推荐

  1. au加载默认的输入和输出设备失败_一文带你读懂 C/C++ 语言输入输出流与缓存区...

    (给CPP开发者加星标,提升C/C++技能) 作者:技术让梦想更伟大 / 李肖遥 (本文来自作者投稿) 前言 有没有发现,基本上所有的C语言入门书籍,或者是我们的教程里面,第一个C语言程序实体,都是& ...

  2. 一分钟带你读懂什么是堆?

    上一篇的 「Java 集合框架」里,还剩下一个大问题没有说的,那就是 PriorityQueue,优先队列,也就是堆,Heap. 什么是堆? 堆其实就是一种特殊的队列--优先队列. 普通的队列游戏规则 ...

  3. uml类图例子_五分钟带你读懂UML类图

    目录 先看下面这张类图,包括了UML类图的基本图示法 1.类的表示 2.接口的表示 3.继承关系 4.实现接口 5.关联关系 6.聚合关系 7.合成(组合)关系 8.依赖关系 先看下面这张类图,包括了 ...

  4. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  5. 优先队列默认是小顶堆吗_堆和堆傻傻分不清?进来!包教会!

    什么是堆? 堆其实就是一种特殊的队列--优先队列. 普通的队列游戏规则很简单:就是先进先出:但这种优先队列搞特殊,不是按照进队列的时间顺序,而是按照每个元素的优先级来比拼,优先级高的在堆顶. 这也很容 ...

  6. 9个元素换6次达到排序序列_一文带你读懂排序算法(三):堆排序算法

    国庆节快乐~点击上方文字关注我们哦 堆是一种特殊的树形数据结构,其每一个结点都有一个值,通常提到的堆都是指一棵完全二叉树,根结点的值小于(或大于)两个子结点的值,同时,根结点的两个子树也分别是一个堆. ...

  7. rocketmq广播消息为什么不能重试_几分钟带你看懂“消息队列和RocketMQ”的入门总结

    消息队列扫盲 消息队列顾名思义就是存放消息的队列,队列我就不解释了,别告诉我你连队列都不知道似啥吧? 所以问题并不是消息队列是什么,而是 消息队列为什么会出现?消息队列能用来干什么?用它来干这些事会带 ...

  8. 输出一个由*组成的三角形图案_一文带你读懂集成电路的组成与封装形式

    1什么是集成电路 集成电路,英文为IntegratedCircuit,缩写为IC:顾名思义,就是把一定数量的常用电子元件,如电阻.电容.晶体管等,以及这些元件之间的连线,通过半导体工艺集成在一起的具有 ...

  9. 归并排序时间复杂度_一文带你读懂排序算法(四):归并算法

    点击上方蓝字关注我们 归并排序的基本思想核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解,最原问题的解就是子问题解的合并.算 ...

最新文章

  1. python socket实现文件传输(防粘包)
  2. qrcode.js 二维码生成器
  3. C#数据结构-单链表
  4. java utf8 byte_byte以及UTF-8的转码规则
  5. “我,程序员,33岁,距离退休,只剩2年了!”
  6. 四项第一!这款芯片让全世界嫉妒!
  7. Got error ‘parentheses not balanced‘ from regexp
  8. [Unity3D]Unity3D圣骑士当游戏开发商遭遇Mecanim动画系统
  9. bootstarp 网格系统
  10. python getopt的用法
  11. Win10系统隐藏磁盘
  12. SEM实验室常见仪器计量问题详解及仪器标准大全附
  13. 使用傅里叶模态法分析闪耀光栅
  14. 元素周期表排列的规律_元素周期表的元素排列规律和元素的性质
  15. Oracle EBS新汇总模板创建系统余额表的记录
  16. IFR02红外雨量传感器
  17. 在嵌入式板子ARMv7 上利用neon对彩色图转换为灰度图进行加速
  18. ServiceHot ITSM助力天原集团IT运维信息化建设
  19. 从“知识的价格”看人们在学什么
  20. 22下半年软考集成广东卷(中项)真题在线估分

热门文章

  1. 检测到目标FTP服务可匿名访问
  2. 一键部署 Spring Boot 到远程 Docker 容器
  3. 企业级实战01_ActiveMQ 下载、安装、运行、实战需求
  4. 查看计算机或网络资源列表的命令,dos命令net view图文教程,显示网络计算机列表查看共享资源...
  5. python语言是编译性语音_最强编程语言 Java 和最受欢迎之 Python 的巅峰对决
  6. html form int,is_int, is_numeric, is_float, and HTML form validation
  7. Linux手机适配,nginx同时适配PC版和手机移动版
  8. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作
  9. C/C++ _strlwr_s 函数 – 字符串大写转小写- C语言零基础入门教程
  10. Python str 函数 - Python零基础入门教程