小工具知识网

当前位置: 首页 > 行业知识 > 【数据结构】优先级队列(堆)

行业知识

【数据结构】优先级队列(堆)

2026-11-13 09:08:43 来源:互联网转载

文章目录

  • 一、优先级队列
    • 概念
    • 二、优先级队列的模拟实现
      • 1、堆的概念
      • 2、堆的存储方式
      • 三、常用接口介绍
        • 1、PriorityQueue的特性
        • 2、PriorityQueue常���接口介绍

          一、优先级队列

          概念

          前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队

          ()

          列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如

          果有来电,那么系统应该优先处理打进来的电话。

          ()

          在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。

          这种数据结构就是优先级队列(Priority Queue)。

          二、优先级队列的模拟实现

          JDK1.8中的PriorityQueue底层使用了堆的数据结构,而堆实际就是在完全二叉树的基础之上进行了一些元素的调

          整。

          1、堆的概念

          如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一

          个一维数组中,并满足:Ki = K2i+2) i = 0,1,2…,则称为 小堆(或大

          堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

          堆的性质:

          堆中某个节点的值总是不大于或不小于其父节点的值;

          堆总是一棵完全二叉树。

          2、堆的存储方式

          从堆的概念可知,堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来高效存储,注意:对于非完全二叉树,则不适合使用顺序方式进行存储,因为为了能够还原二叉树,空间中必须要存储空节

          点,就会导致空间利用率比较低。

          将元素存储到数组中后,可以根据二叉树章节的性质5对树进行还原。假设i为节点在数组中的下标,则有:

          如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为 (i - 1)/2

          如果2 * i + 1 小于节点个数,则节点i的左孩子下标为2 * i + 1,否则没有左孩子

          如果2 * i + 2 小于节点个数,则节点i的右孩子下标为2 * i + 2,否则没有右孩子

          三、常用接口介绍

          1、PriorityQueue的特性

          Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线

          程不安全的,PriorityBlockingQueue是线程安全的。

          关于PriorityQueue的使用要注意:

          1. 使用时必须导入PriorityQueue所在的包,即:
          import java.util.PriorityQueue;
          1. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常
          2. 不能插入null对象,否则会抛出NullPointerException
          3. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
          4. 插入和删除元素的时间复杂度为
          5. PriorityQueue底层使用了堆数据结构, (注意:此处大家可以不用管什么是堆,后文中有介绍)
          6. PriorityQueue默认情况下是小堆—即每次获取到的元素都是最小的元素

          2、PriorityQueue常用接口介绍

          1. 优先级队列的构造
          static void TestPriorityQueue(){// 创建一个空的优先级队列,底层默认容量是11PriorityQueue q1 = new PriorityQueue();// 创建一个空的优先级队列,底层的容量为initialCapacityPriorityQueue q2 = new PriorityQueue(100);ArrayList list = new ArrayList();list.add(4);list.add(3);list.add(2);list.add(1);// 用ArrayList对象来构造一个优先级队列的对象// q3中已经包含了三个元素PriorityQueue q3 = new PriorityQueue(list);System.out.println(q3.size());System.out.println(q3.peek());}

上一篇:网易服务器皮肤怎么换肤色?

下一篇:beplay服务器在哪里?