0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是堆,堆在整个Java集合框架中的作用

454398 来源:chinaunix 作者:是小齐呀 2020-10-16 11:26 次阅读

堆其实就是一种特殊的队列——优先队列。

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

这也很容易理解吧,比如各种软件都有会员制度,某软件用了会员就能加速下载的,不同等级的会员速度还不一样,那就是优先级不同呀。

还有其实每个人回复微信消息也是默默的把消息放进堆里排个序:先回男朋友女朋友的,然后再回其他人的。

这里要区别于操作系统里的那个“堆”,这两个虽然都叫堆,但是没有半毛钱关系,都是借用了Heap这个英文单词而已。

我们再来回顾一下「堆」在整个Java集合框架中的位置:

也就是说,

PriorityQueue是一个类(class);

PriorityQueue继承自Queue这个接口(Interface);

那heap在哪呢?

heap其实是一个抽象的数据结构,或者说是逻辑上的数据结构,并不是一个物理上真实存在的数据结构。

heap其实有很多种实现方式,比如binomialheap,Fibonacciheap等等。但是面试最常考的,也是最经典的,就是binaryheap二叉堆,也就是用一棵完全二叉树来实现的。

那完全二叉树是怎么实现的?

其实是用数组来实现的!

所以binaryheap/PriorityQueue实际上是用数组来实现的。

这个数组的排列方式有点特别,因为它总会维护你定义的(或者默认的)优先级最高的元素在数组的首位,所以不是随便一个数组都叫「堆」,实际上,它在你心里,应该是一棵「完全二叉树」。

这棵完全二叉树,只存在你心里和各大书本上;实际在在内存里,哪有什么树?就是数组罢了。

那为什么完全二叉树可以用数组来实现?是不是所有的树都能用数组来实现?

这个就涉及完全二叉树的性质了,我们下一篇会细讲,简单来说,因为完全二叉树的定义要求了它在层序遍历的时候没有气泡,也就是连续存储的,所以可以用数组来存放;第二个问题当然是否。

堆的特点

堆是一棵完全二叉树;

堆序性(heaporder):任意节点都优于它的所有孩子

a.如果是任意节点都大于它的所有孩子,这样的堆叫大顶堆,MaxHeap;

b.如果是任意节点都小于它的所有孩子,这样的堆叫小顶堆,MinHeap;

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

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

比如对于节点3来说,

它的Index=1,

它的parentindex=0,

左孩子leftchildindex=3,

右孩子rightchildindex=4.

可以归纳出如下规律:

设当前节点的index=x,

那么parentindex=(x-1)/2,

左孩子leftchildindex=2*x+1,

右孩子rightchildindex=2*x+2.

有些书上可能写法稍有不同,是因为它们的数组是从1开始的,而我这里数组的下标是从0开始的,都是可以的。

这样就可以从任意一个点,一步找到它的孙子、曾孙子,真的太方便了,在之后讲具体操作时大家可以更深刻的体会到。

那有关堆的基本操作,以及为什么heapify()是O(n)的,我们之后再聊。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2954

    浏览量

    104511
  • 堆栈
    +关注

    关注

    0

    文章

    182

    浏览量

    19724
  • 队列
    +关注

    关注

    1

    文章

    46

    浏览量

    10886
收藏 人收藏

    评论

    相关推荐

    java集合干货系列

      Comparable和Comparator都是Java集合框架的成员  Iterator接口  集合输出的标注你操作  标准做法,使用Iterator接口  操作原理:  Iter
    发表于 12-14 15:11

    压水是什么意思?压水堆有什么作用

    压水是什么意思?压水堆有什么作用?压水y有哪些功能?
    发表于 07-01 08:43

    什么是桥,桥作用是什么?

    主要作用是整流,调整电流方向。用桥整流是比较好的,首先是很方便,而且它内部的四个管子一般是挑选配对的,所以其性能较接近,还有就是大功率的整流时,桥堆上都可以装散热块,使工作时性能更稳定,当然使用场
    发表于 01-25 10:24

    整流,什么是整流

    整流,什么是整流的检测 1. 全桥的检测 大多数的整流全桥上,均标注有“+”、“-”、“~”符号(其中“+”为整流后输出电压
    发表于 02-27 10:46 2118次阅读

    常用桥及半桥电路结构分析

    及半桥都是整流二极管的组合器件,这一点可以从它们的结构中看出。许多电源电路中使用桥或半桥构成整流电路。
    发表于 08-26 10:34 8518次阅读
    常用桥<b class='flag-5'>堆</b>及半桥<b class='flag-5'>堆</b>电路结构分析

    明确区分与栈,和栈究竟有什么区别?

    这条短短的一句话就包含了与栈,看到new,我们首先就应该想到,我们分配了一块内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:栈内存存放了一个指向一块
    的头像 发表于 04-09 09:45 4391次阅读
    明确区分<b class='flag-5'>堆</b>与栈,<b class='flag-5'>堆</b>和栈究竟有什么区别?

    什么是内存?内存是如何分配的?

    一般的编译系统内存的分配方向和栈内存是相反的。当栈内存从高地址向低地址增长的时候,内存从低地址向高地址分配。
    的头像 发表于 07-05 17:58 9908次阅读

    整流桥作用和原理图

    整流桥作用和原理图  整流桥是一种电路,可以将交流电信号转换为直流电信号。许多电子设备,电子元件需要直流电源来供电,而通常的电源是
    的头像 发表于 08-24 15:17 7077次阅读

    作用是什么?桥整流后电压是多少?

    电源,电视机电源等。本文将详细解读桥作用及工作原理。 一、桥作用 1.将交流电转换成直流电 桥的主要
    的头像 发表于 08-24 15:17 7387次阅读

    整流桥作用是什么?发电机整流桥的作用是什么?

    整流桥作用是什么?发电机整流桥的作用是什么? 整流桥作用电路
    的头像 发表于 08-24 15:18 2806次阅读

    Java的对象一定在中分配吗

    我们的日常编程实践,我们经常会遇到各种类型的对象,比如字符串、列表、自定义类等等。这些对象在内存是如何存储的呢? 你可能会毫不犹豫地回答:“
    的头像 发表于 09-30 10:19 912次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>的对象一定在<b class='flag-5'>堆</b>中分配吗

    的实现思路

    要么等于或者大于(小于)子节点的值。 1.1 的分类 一般分为两类: 大堆和小堆 。 大堆,父节点的值大于或等于子节点的值, 小堆,父节点的值小于或等于子节点的值。
    的头像 发表于 11-24 16:02 387次阅读
    <b class='flag-5'>堆</b>的实现思路

    jvm配置内存初始值参数

    JVM(Java Virtual Machine)是Java语言的运行环境,它通过解释字节码并执行相应的指令来运行Java程序。JVM
    的头像 发表于 12-05 14:17 723次阅读

    ATA-P系列功率放大器压电叠作用是什么

    功率放大器压电叠作用是为压电叠提供足够的电能,使其产生强大的机械振动。以下为您详细介绍一下。 压电叠
    的头像 发表于 01-09 16:14 355次阅读
    ATA-P系列功率放大器<b class='flag-5'>在</b>压电叠<b class='flag-5'>堆</b><b class='flag-5'>中</b>的<b class='flag-5'>作用</b>是什么

    如何使用SystemView的监控功能

    SystemView能够监视应用程序如何使用动态存储。这意味着,如果应用程序中使用了C或C++、自定义或RTOS提供的内存池对象,我们可以跟踪这些对象的使用情况。SystemView可以一个
    的头像 发表于 08-09 18:07 689次阅读
    如何使用SystemView的<b class='flag-5'>堆</b>监控功能