首页 > 其他分享 >优先队列(PriorityQueue)常用方法及简单案例

优先队列(PriorityQueue)常用方法及简单案例

时间:2023-03-19 12:34:10浏览次数:49  
标签:案例 队列 元素 PriorityQueue int que public

1 前言

PriorityQueue是一种特殊的队列,满足队列的“队尾进、队头出”条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆)。具体调整如下:

  • 插入元素后,从堆底到堆顶调整堆;
  • 删除元素后,将队尾元素复制到队头,并从堆顶到堆底调整堆。

PriorityQueue采用数组实现,也是一棵完全二叉树,构成堆结构。数组初始大小为11。

Queue框架如下:

img Queue框架

2 PriorityQueue常用方法

public boolean add(E e); //在队尾添加元素,并调整堆结构
public E remove(); //在队头删除元素,并返回,再调整堆结构
public E element(); //返回队头元素(不删除)
public boolean isEmpty(); //判断队列是否为空

public int size(); //获取队列中元素个数
public void clear(); //清空队列
public boolean contains(Object o); //判断队列中是否包含指定元素(从队头到队尾遍历)
public Iterator<E> iterator(); //迭代器

3 简单案例

3.1 最小优先队列

import java.util.PriorityQueue;

public class Main {
	static int[] a={6,4,7,3,9,8,1,2,5,0};
	
	public static void main(String[] args) {
		fun();
	}
	
	static void fun() {
		PriorityQueue<Integer> que=new PriorityQueue<Integer>();
		for(int e:a) {
			que.add(e);
		}
		for(int e:que) {
			System.out.print(e+" ");
		}
		System.out.println();
		while(!que.isEmpty()) {
			int e=que.remove();
			System.out.print(e+" ");
		}
	}
}

运行结果:

0 1 3 4 2 8 7 6 5 9 
0 1 2 3 4 5 6 7 8 9 

堆结构:

img 最小优先队列内部堆结构

3.2 最大优先队列

import java.util.Comparator;
import java.util.PriorityQueue;

public class Main {
	static int[] a={6,4,7,3,9,8,1,2,5,0};
	
	public static void main(String[] args) {
		fun();
	}
	
	static void fun() {
		PriorityQueue<Integer> que=new PriorityQueue<Integer>(new Comparator<Integer>() {
			public int compare(Integer o1, Integer o2) {				
				return o2-o1;
			}
		});
		for(int e:a) {
			que.add(e);
		}
		for(int e:que) {
			System.out.print(e+" ");
		}
		System.out.println();
		while(!que.isEmpty()) {
			int e=que.remove();
			System.out.print(e+" ");
		}
	}
}

运行结果:

9 7 8 5 4 6 1 2 3 0 
9 8 7 6 5 4 3 2 1 0 

堆结构:

img 最大优先队列内部堆结构

3.3 topK问题

topK问题是指:从海量数据中寻找最大的前k个数据,比如从1亿个数据中,寻找最大的1万个数。

使用优先队列,能够很好的解决这个问题。先使用前1万个数构建最小优先队列,以后每取一个数,都与队头元素进行比较,若大于队头元素,就将队头元素删除,并将该元素添加到优先队列中;若小于队头元素,则将该元素丢弃掉。如此往复,直至所有元素都访问完。最后优先队列中的1万个元素就是最大的1万个元素。

为方便实验,这里以求 {6,4,7,3,9,8,1,2,5,0} 中最大的5个数为例。

import java.util.PriorityQueue;

public class Main {
	static int[] a={6,4,7,3,9,8,1,2,5,0};
	
	public static void main(String[] args) {
		fun();
	}

	static void fun() {
		PriorityQueue<Integer> que=new PriorityQueue<Integer>();
		for(int i=0;i<5;i++) {
			que.add(a[i]);
		}
		for(int i=5;i<10;i++) {
			if(a[i]>que.element()) {
				que.remove();
				que.add(a[i]);
			}
		}
		while(!que.isEmpty()) {
			int e=que.remove();
			System.out.print(e+" ");
		}
	}
}

运行结果:

5 6 7 8 9

​ 声明:本文转自优先队列(PriorityQueue)常用方法及简单案例

标签:案例,队列,元素,PriorityQueue,int,que,public
From: https://www.cnblogs.com/zhyan8/p/17232799.html

相关文章

  • 基于tensorflow的RBF神经网络案例
    1前言在使用RBF神经网络实现函数逼近中,笔者介绍了使用Matlab训练RBF神经网络。本博客将介绍使用tensorflow训练RBF神经网络。代码资源见:RBF案例(更新版)这几天,笔者在......
  • Python三次样条插值与MATLAB三次样条插值简单案例
    1三次样条插值早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿木条画下曲线,成为样条曲线。设函数S(x)∈C2[a,b],且在每......
  • seq2seq模型案例分析
    1seq2seq模型简介seq2seq模型是一种基于【Encoder-Decoder】(编码器-解码器)框架的神经网络模型,广泛应用于自然语言翻译、人机对话等领域。目前,【seq2seq+attention】(注......
  • 【RabbitMQ消息中间件】11.持久化和非持久化队列
    上一篇介绍并搭建了Spring-Rabbit工程,并且创建了一个名为MyQueue的队列。下面补充一个有关持久化和非持久化队列的知识点。登录RabbitMQ的图形化管理界......
  • 3.7 队列的表示和实现
    3.5队列的表示和操作实现相关术语队列(Queue)是仅在表尾进行插入操作,在表头进行删除操作的线性表。表尾及a(((((n)))))端,称为队尾;表头即a(((((1)))))端称为......
  • 3.8 队列的顺序表示和实现
    3.5.2队列的顺序表示和实现队列的物理存储可以用顺序结构,也可用链式存储结构,相应地队列的存储方式也分为两种,即顺序队列和链式队列、队列的顺序表示——————......
  • 3.9 队列的链式表示和实现
    3.5.3队列的链式表示和实现适用于用户无法估计所用队列的长度,则适宜采用该类型的队列链式队列的结构图如下所示链队列的类型定义//这里是定义是每个节点类型t......
  • 3.1 栈和队列定义和特点
    栈和队列是限定插入和删除的只能在表“端点”进行的线性表普通线性表的插入和删除操作栈的定义和特点栈(stack)是一个特殊的线性表,是限定的仅在一端(通常是表尾)进行插......
  • 3.2 案例引入
    【案例1】进制转换十进制整数N向其他进制数d(二、八、十六)的转换是计算机实现计算基本问题转换法则:除以d倒取余该转换法则对应一个简单算法原理:n=(ndivd)*d+nmod......
  • tensorrt官方案例 python运行
    1、案例数据下载1)-f配置案例的下载内容,会自动下载到案例文件夹中downloader.py-dD:/Programs/TensorRT-8.4.1.5/-f./yolov3_onnx/download.yml2、downloader.py中......