【Java数据结构】第十章 —— 优先级队列(堆)

 

导航小助手

一、优先级队列

二、堆

2.1 堆的概念

2.2 堆的存储方式

2.3 堆的创建

2.4 堆的插入、删除、获取堆顶元素

2.4.1 堆的插入

2.4.2 堆的删除

2.4.3 获取堆顶元素

2.5 关于堆的常见习题

三、PriorityQueue

3.1 部分源码示例

3.2 常用方法

3.3 注意事项


一、优先级队列

优先级队列,又称为 堆~

前面博客所介绍的 二叉树 其实是链式存储的,每一个节点都有 其左孩子的引用和右孩子的引用;而 优先级队列 实际上是一个顺序存储的二叉树,由数组来进行存储的~

在之前介绍队列的时候,我们知道它是一种 先进先出 的数据结构;但是,在有些情况下,操作的数据 可能带有优先级(一般出队列时,可能需要优先级高的元素先出队列),此时 使用队列显然不合适(无法保证优先级)~

比如说,张三正在家里看小说的时候,突然来了一个电话,那么此时 接电话的优先级肯定是要高于看小说的优先级;数据 也是一样,重要的先解决,不重要的先放一放~

在这种情况下,数据结构应该提供两个最基本的操作:一个是返回最高优先级对象,一个是添加新的对象(每次拿到的都是当前队列中优先级最高的);这种数据结构就是 优先级队列~

JDK1.8 中的优先级队列 底层 使用了堆的数据结构,而堆其实就是在完全二叉树的基础上 进行了一些元素的调整~

  

二、堆

2.1 堆的概念

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个 一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆~

需要知道的是,堆是一颗完全二叉树~

 在介绍二叉树的相关博客当中,曾经介绍了一个结论(这个还是需要知道的):

这个结论将在下面用到~

  

你可能感兴趣的:(堆,优先级队列,数据结构)