美文网首页
堆的详解

堆的详解

作者: 表琴帝 | 来源:发表于2020-04-11 18:16 被阅读0次

1 定义如下:首先堆树是一个完全二叉树 其次堆中的某个节点总是大于或者小于其孩子节点的值 最后堆树中每个节点的子树都是堆树

补充:

完全二叉树(Complete Binary Tree): 每层结点都完全填满,在最后一层上如果不是满的,则只缺少右边的若干结点。

完美二叉树(Perfect Binary Tree) 所有的非叶子结点都有两个孩子,所有的叶子结点都在同一层。

2 最大堆 最小堆

3 堆树的操作

原始数据采用顺序存储方式

最大堆的构造:待学习

树的节点个数是n,以1为下标开始编号,直到n结束,对于节点I,其父节点为i/2,左孩子为i*2,右孩子节点为i*2+1;最后一个节点为N,其父节点为n/2

用priorityQueue(优先队列),一个基于优先级堆的无界优先队列。最大堆和最小堆实际上是一个堆,不指定comparator时默认最小堆,通过传入自定义的Comparator函数可以实现大顶堆

PriorityQueue minHeap = new PriorityQueue(); //小顶堆,默认容量为11

PriorityQueue maxHeap = new PriorityQueue(11,new Comparator(){ //大顶堆,容量11

    @Override

    public int compare(Integer i1,Integer i2){

        return i2-i1;

    }

});

常见操作:

poll(),offer(Object),size(),peek()等。

插入方法(offer()、poll()、remove() 、add() 方法)时间复杂度为O(log(n)) ;

remove(Object) 和 contains(Object) 时间复杂度为O(n);

检索方法(peek、element 和 size)时间复杂度为常量。

API文档说明:

构造方法摘要PriorityQueue()

方法摘要  add()指定元素插入到此优先队列中   remove()移除指定元素clear()移除所有元素 offer()插入元素到队列  peek()和poll()前者获取 后者获取并且移除

解决TOP k 问题

优先队列是不同于先进先出队列的另外一种队列。每次从队列中取出的都是具有最高优先权的元素。默认自然顺序排列,也可以根据Comparator来指定

优先队列不允许NULL元素,不允许插入不可比较的对象

用add一个个加上去,自动给你排好序

注意1 该队列是用数组实现的,但是数组的大小可以动态增加,容量无限

注意2 此实现是不同步的

注意3 不允许使用null元素

注意4 插入方法(offer()、poll()、remove() 、add() 方法)时间复杂度为O(log(n)) ;

remove(Object) 和 contains(Object) 时间复杂度为O(n);

检索方法(peek、element 和 size)时间复杂度为常量。

排序的主要有两种:快速排序和基于堆实现的优先级队列 求Top K 更简单的方法可以直接使用内置的Treemap或者treeset 这两者都是基于红黑树的一种数据结构

,每次添加新元素,其排序的开销都要大于对调整的开销,堆化

相关文章

  • 堆的详解

    1 定义如下:首先堆树是一个完全二叉树 其次堆中的某个节点总是大于或者小于其孩子节点的值 最后堆树中每个节点的子树...

  • JVM——JVM运行时堆内存详解

    前言 今天就来介绍一下JVM运行时堆内存详解。 JVM运行时堆内存详解 Java 堆从 GC 的角度还可以细分为:...

  • 2019-02-08

    栈块、堆块、全局块 (Block详解) 对于Block之前只是在用,对于栈,堆这块没有细入研究,今天抽空把”Eff...

  • C语言堆空间详解

    栈空间是存放局部变量的存储器,主要在于栈可以出栈,入栈的操作,可以将我们的临时变量替换。只读空间可以认为是我们程序...

  • 堆,栈和GC详解

    1、栈(stack)是存放方法的局部变量的内存空间,每个方法都会分配一块内存空间frame,方法一旦执行完成,fr...

  • JVM各个区域详解

    一、JVM的结构详解 1、堆 Java堆是所有线程共享的。是虚拟机启动的时候创建的。存放的是对象的实例和数组。所占...

  • 内存管理

    一,堆和栈 二,空指针、野指针和僵尸对象、内存泄露 三,assign,weak,strong,copy 详解 四,...

  • java 堆栈

    参考文章:1.JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解2.java里的静态成员...

  • (转载)JVM 史上最最最完整深入解析(12000 字噢)

    Java运行时数据区: JMM Java内存模型: 堆的内存划分: GC垃圾回收: HotSpot 虚拟机详解: ...

  • 堆外内存 之 DirectByteBuffer 详解

    堆外内存 堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建...

网友评论

      本文标题:堆的详解

      本文链接:https://www.haomeiwen.com/subject/psbumhtx.html