1. 二叉树的顺序存储

1.1 存储方式

使用数组保存二叉树的结构,方式即将二叉树用层序遍历方式放入数组中。一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。这种方式的主要用法就是堆的表示。

1.2 下标关系

已知双亲(parent)的下标,则
左孩子(left)下标 = 2 * parent + 1;
右孩子(right)下标 = 2 * parent + 2;
已知孩子(不区分左右)(child)下标,则:
双亲(parent)下标 = (child - 1) / 2;

2. 堆(heap)

2.1 概念

  1. 堆逻辑上是一棵完全二叉树
  2. 堆物理上是保存在数组中
  3. 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆
  4. 反之,则是小堆,或者小根堆,或者最小堆
  5. 堆的基本作用是,快速找集合中的最值

2.2 建堆

给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的子树开始调整,一直调整到根节点的树,就可以调整成堆。
代码(以大堆为例):

public static void createHeap(int[] array, int size) { for (int i = (size - 1) / 2; i >= 0; i--) { shiftDown(array, size, i);
}
}
// 建堆前
int[] array = { 1,5,3,8,7,6 };
// 建堆后
int[] array = { 8,7,6,5,1,3 };

时间复杂度分析:
大概估算,可以认为是在循环中执行向下调整,为 O(n * log(n)),实际上是 O(n)
建堆过程时间复杂度怎么来的?

3. 堆的应用-优先级队列

3.1 有关概念

很多场景中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)

3.1 内部原理

优先级队列的实现方式有很多,但最常见的是使用堆来构建。

3.2 操作-入队列

过程(以大堆为例):

  1. 首先按尾插方式放入数组
  2. 比较其和其双亲的值的大小,如果双亲的值大,则满足堆的性质,插入结束
  3. 否则,交换其和双亲位置的值,重新进行 2、3 步骤
  4. 直到根结点
    代码:
public static void shiftUp(int[] array, int index) { while (index > 0) { int parent = (index - 1) / 2; if (array[parent] >= array[index]) {break; }int t = array[parent]; array[parent] = array[index]; array[index] = t; index = parent; } }

3.3 操作-出队列

为了防止破坏堆的结构,删除时并不是直接将堆顶元素删除,而是用数组的最后一个元素替换堆顶元素,然后通过向下调整方式重新调整成堆
代码:

public class MyPriorityQueue { // 不考虑扩容部分的代码 private int[] array = new int[100]; private int size = 0; public void offer(int e) { array[size++] = e; shiftUp(array, size - 1); }public int poll() { int oldValue = array[0]; array[0] = array[--size]; shiftDown(array, size, 0); return oldValue; }public int peek() { return array[0]; }
}

Java-优先级队列(堆)相关推荐

  1. java优先级队列(堆)

    文章目录 一.优先级队列是什么? 二.堆 什么是堆? 堆的分类: 堆的存储 堆的创建 三.堆的操作 插入元素 弹出元素 四.用堆模拟实现优先级队列 一.优先级队列是什么? 在数据结构中,普通的队列是先 ...

  2. Java 优先级队列

    文章目录 Java 优先级队列 PriorityQueue简介 继承关系 PriorityQueue示例 Comparable比较器 Comparable接口 Comparator比较器 Compar ...

  3. 什么是java优先级队列_什么是Java优先级队列(Priority Queue)?

    39 优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索.无论何时调用remove方法,总会获得当前优先级队列中的最小元素,但并不是对所有元素都排序.它是采用了堆(一个可以自我调整 ...

  4. java优先级队列使用

    优先级队列是比栈和队列更专用的结构,在多数情况下都非常有用.优先级队列像普通队列一样,有一个队头和队尾,并且也是从队头移除数据. 优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适 ...

  5. Java优先级队列PriorityQueue

    1.优先级队列概述 PriorityQueue,即优先队列.优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大 ...

  6. 数据结构之堆(Heap),堆的相关操作,用堆模拟优先级队列

    目录 堆的概念 堆的存储方式 堆的相关操作 堆的向下调整. 堆的创建 堆的插入和向上调整 堆的删除 用堆模拟优先级队列 堆的概念 堆是逻辑结构为二叉树存储结构为数组数组的一种数据结构,为什么这么说呢? ...

  7. 优先级队列--大根堆和小根堆

    概述 与FIFO的普通队列不同,在优先级队列中,元素出队顺序是由元素的优先级决定.比如大根堆是最大的元素先出队,小根堆是最小的元素先出队. 堆是实现优先级队列效率很高的数据结构(当然我们也可以使用无序 ...

  8. java 链表 最小堆优先级队列_关于Java集合的小抄

    List ArrayList 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值.默认第一次插入元 ...

  9. java队列优先级_优先级队列-Java的PriorityQueue与最小堆有何不同?

    来自Java文档 表示为平衡二进制堆的优先级队列:queue [n]的两个子级是queue [2 * n + 1]和queue [2 *(n + 1)]. 优先级队列由比较器或元素的自然顺序进行排序. ...

  10. Java PriorityQueue(优先级队列/二叉堆)的使用及题目应用

    目录 PriorityQueue有几个需要注意的点: 重写比较器的方法 应用题目 LeetCode 1845. 座位预约管理系统 LeetCode 215. 数组中的第 K 个最大元素(同剑指 Off ...

最新文章

  1. WAIC剪影:AI的未来,关乎星辰大海
  2. java verbose gc_jvm参数-verbose:gc和-XX:+PrintGC有区别?
  3. 新闻评副高职称条件计算机,新闻系列副高职称评审有哪些条件
  4. 浙江师范大学python试卷_2014考研计算机真题试卷及答案(浙江师范大学考点)
  5. 实验16 编写包含多个功能子程序的中断例程
  6. 滴滴出行的数据架构和信息流处理思路解析
  7. jsonp的使用方法
  8. ArchLinux On Win10
  9. 0005-Windows Kerberos客户端配置并访问CDH
  10. maven打包的时候同时打源码包,并同时将源码包上传私服
  11. 传奇3便捷架设管理工具-BY来世今生
  12. 数据挖掘技术的算法与应用【转】
  13. java 阶梯_Java if-else-if阶梯语句
  14. 单8通道数字控制模拟电子开关CD4051
  15. MassGrid虚拟机网络Alpha版上线体验
  16. 10设置精美的免费网站后台管理系统模板
  17. 中国的智能眼镜可以怎么做?
  18. H5APP开发封装流程
  19. 05-安全点和安全域是什么?
  20. 自动化逆向辅助利器 -- Capa工具介绍

热门文章

  1. jquery-ajax的同步与异步
  2. boootstap-面包屑-下拉菜单
  3. Nginx进程间通信机制
  4. 能让你开发效率翻倍的 sublime 插件配置
  5. ReSIProcate环境搭建
  6. Angular 4.x 自定义验证指令
  7. ZABBIX API简介及使用
  8. Buffer与Cache
  9. 引人瞩目的 CSS 变量(CSS Variable)
  10. UVA494 Kindergarten Counting Game