数据结构---优先队列
创始人
2024-04-23 23:25:34
0次

优先队列

  • 实现方式
    • 入队
    • 出队
  • JAVA实现
  • 总结

二叉堆是实现优先队列的基础,上一篇二叉堆博文: 二叉堆

队列的特点是先进先出(FIFO)。
优先队列不再遵循先入先出的原则,而是分为两种情况。

  1. 最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
  2. 最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队

最大优先队列
在这里插入图片描述

实现方式

可以用最大堆来实现最大优先队列,这样的话,每一次入队操作就是堆的插入操作,每一次出队操作就是删除堆顶节点。

入队

入队就是在数组末尾加上入队元素,在调用最大堆上浮函数,把这个数字上浮到合适的位置
在这里插入图片描述
在这里插入图片描述

出队

出队就是把数组第一个元素取出,在把数组末尾的元素填到第一个位置,在调用最大堆下沉函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉堆节点“上浮”和“下沉”的时间复杂度都是O(logn),所以优先队列入队和出队的时间复杂度也是O(logn)!

JAVA实现

package dataStructure.myPriorityQueue;import java.util.Arrays;//最大优先队列
public class priorityQueue {private int size;private int[] array;public priorityQueue() {//优先队列初始长度为32array = new int[32];}/*** 上浮(入队)*/private void upAdjust(){//都是从数组最后一个位置(size-1;)入队int childIndex = size-1;int parentIndex = (childIndex-1)/2;// temp 保存插入的叶子节点值,用于最后的赋值int temp = array[childIndex];//最大堆(最大优先队列)while (childIndex>0&&temp>array[parentIndex]){array[childIndex] = array[parentIndex];childIndex = parentIndex;parentIndex = parentIndex/2;}array[childIndex] = temp;}/*** 下沉(出队)*/private void downAdjust(){// temp 保存父节点的值,用于最后的赋值//删除的是根节点(最大值出队)int parentIndex = 0;int temp = array[parentIndex];//左孩子下标int childIndex = 1;while (childIndex// 如果有右孩子,且右孩子大于左孩子的值,则定位到右孩子//需要从左右孩子找最大的(最大堆)if(childIndex+1array[childIndex]){childIndex++;}// 如果父节点大于任何一个孩子的值,直接跳出(已经是最大堆了)if(temp>=array[childIndex]){break;}array[parentIndex] = array[childIndex];//再向下找parentIndex = childIndex;childIndex = 2*childIndex+1;}array[parentIndex] = temp;}/*** 队列扩容*/private void resize(){int newSize = this.size*2;this.array = Arrays.copyOf(this.array,newSize);}/*** 入队* @param key   入队的值*/public void enQueue(int key){if(size>=array.length){resize();}//数组最后一个位置入队array[size++] = key;//再进行堆上浮upAdjust();}public int deQueue() throws Exception{if (size<0){throw new Exception("空的最大优先队列,出队失败");}//获取堆顶元素int head = array[0];//把最后一个元素移动到堆顶array[0] = array[--size];//堆下沉downAdjust();return head;}public static void main(String[] args) throws Exception {priorityQueue priorityQueue = new priorityQueue();priorityQueue.enQueue(3);priorityQueue.enQueue(5);priorityQueue.enQueue(10);priorityQueue.enQueue(10);priorityQueue.enQueue(2);priorityQueue.enQueue(7);System.out.println("最大优先队列出队:"+priorityQueue.deQueue());}}

在这里插入图片描述

总结

优先队列分为最大优先队列和最小优先队列。

  1. 在最大优先队列中,无论入队顺序如何,当前最大的元素都会优先出队,这是基于最大堆实现的。
  2. 在最小优先队列中,无论入队顺序如何,当前最小的元素都会优先出队,这是基于最小堆实现的

二叉堆是一种特殊的完全二叉树,分为最大堆和最小堆。

  1. 在最大堆中,任何一个父节点的值,都大于或等于它左、右孩子节点的值。
  2. 在最小堆中,任何一个父节点的值,都小于或等于它左、右孩子节点的值。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...