优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。Java中,PriorityQueue的底层数据结构就是堆(默认是小堆),关于Java的PriorityQueue更多知识请点击:深入理解Java PriorityQueue。
优先队列的实现中,我们可以选择堆数据结构,最大优先队列可以选用大堆,最小优先队列可以选用小堆来实现。下面以最大优先队列来讲解其原理。最大优先队列一般包括将一个元素插入到集合S中、返回集合S中具有最大key的元素、返回并删除集合S中具有最大key的元素等。
栈:先进后出
队列:先进先出 ,结合最小堆,最大堆,实现优先队列(堆的加入,先加入到最后的叶子,然后上浮,删除是删除最值,然后最下的叶子代替,然后新的根下降),优先队列
可以用来实现优先调度
堆:也是用树来实现的,树就是用数组实现,树的层级遍历就是数组的存储结构,通过节点的比较,上浮,下沉实现,只不过查找二叉树在实现上浮的过程中实现了左右的比较
插入操作
插入操作是将一个元素插入到集合S中,首先把该元素放入所有元素的下一位置,然后执行“上浮”操作,如下图示例(注意,下图示例是小堆,不过原理是一样的,图片来自深入理解Java PriorityQueue)
)
移除操作
优先队列中,在队列非空情况下移除集合中第一个元素,也就是下标为0的元素,然后将集合中最后一个元素移到下标为0位置,在将下标为0的新元素执行“下沉”操作。如下图示例(注意,下图示例是小堆,不过原理是一样的,图片来自深入理解Java PriorityQueue)
完整代码实现
package priorityheap; import java.util.Arrays; /** * 优先队列类(最大优先队列) */ public class PriorityHeap { // ------------------------------ Instance Variables private int[] arr; private int size; // ------------------------------ Constructors /** * 优先队列数组默认大小为64 */ public PriorityHeap() { this(64); } public PriorityHeap(int initSize) { if (initSize <= 0) { initSize = 64; } this.arr = new int[initSize]; this.size = 0; } // ------------------------------ Public methods public int max() { return this.arr[0]; } public int maxAndRemove() { int t = max(); this.arr[0] = this.arr[--size]; sink(0, this.arr[0]); return t; } public void add(int data) { resize(1); this.arr[size++] = data; pop(size - 1, data); } // ------------------------------ Private methods /** * key下沉方法 */ private void sink(int i, int key) { while (2 * i <= this.size - 1) { int child = 2 * i; if (child < this.size - 1 && this.arr[child] < this.arr[child + 1]) { child++; } if (this.arr[i] >= this.arr[child]) { break; } swap(i, child); i = child; } } /** * key上浮方法 */ private void pop(int i, int key) { while (i > 0) { int parent = i / 2; if (this.arr[i] <= this.arr[parent]) { break; } swap(i, parent); i = parent; } } /** * 重新调整数组大小 */ private void resize(int increaseSize) { if ((this.size + increaseSize) > this.arr.length) { int newSize = (this.size + increaseSize) > 2 * this.arr.length ? (this.size + increaseSize) : 2 * this.arr.length; int[] t = this.arr; this.arr = Arrays.copyOf(t, newSize); } } /** * Swaps arr[a] with arr[b]. */ private void swap(int a, int b) { int t = this.arr[a]; this.arr[a] = this.arr[b]; this.arr[b] = t; } } 参考: https://www.cnblogs.com/g177w/p/8444417.html https://www.cnblogs.com/g177w/p/8444750.html https://www.cnblogs.com/luoxn28/p/5616101.html
相关推荐
这篇文章将探讨如何利用数组实现优先队列,并通过提供的`PriorityQ.java`文件来深入理解其实现原理。 1. **优先队列基本概念** 优先队列是一种数据结构,它维护了一个有序的队列,通常按照优先级的高低进行排序。...
- Java的`java.util.PriorityQueue`是优先队列的实现,它基于二叉堆(通常是最小堆),满足堆的性质:父节点的优先级总是不小于子节点。 - PriorityQueue支持`add()`、`offer()`、`peek()`、`poll()`等方法,分别...
优先队列是一种特殊的数据结构,它允许我们快速访问或删除具有最高优先级的元素。在计算机科学中,优先队列通常用作...理解堆和优先队列的工作原理对于深入学习数据结构和算法至关重要,也是提升编程能力的重要一步。
PriorityQueue.java 可能是实现了优先队列类,而 PQTest.java 可能是用来测试该优先队列功能的代码。 1. **PriorityQueue类**: - **构造函数**:可能会包含一个无参构造函数,用于创建空的优先队列,也可能有带...
2. 实现方法:使用无序线性表、有序线性表、链表等结构实现优先队列。 二、优先队列的操作 1. 查找操作:查找一个元素在优先队列中的位置。 2. 插入操作:将一个新元素插入到优先队列中。 3. 删除操作:从优先队列...
优先队列(Priority Queue)是数据结构中的一种特殊队列,它的主要特点是元素的出队顺序不是按照“先进先出...理解并熟练掌握优先队列的原理和使用方法,对于提升编程能力、优化算法效率以及解决实际问题具有重要意义。
优先队列是一种特殊的数据结构,它在队列的基础上增加了“优先级”的概念。在传统的队列中,元素遵循先进先出(FIFO)的原则,即...理解并熟练掌握优先队列的原理和应用,对于提升编程能力、优化算法效率有着重要作用。
在本文中,我们将深入探讨基于VC的堆和最大优先队列的实现,这些实现是通过C++编程语言完成的。堆是一种特殊的树形数据结构,它满足特定的性质,如最大堆或最小堆,常被用于优化算法和解决各种问题。在VC(Visual ...
每个题目都需要对优先队列的原理有深刻的理解,以便正确使用它们来找到解决方案。 为了更好地掌握优先队列的概念,文件中还建议读者访问作者的博客,那里可能有更多的例题链接和详细题解。 最后,文件中强调了STL...
《优先队列的归纳》 优先队列是一种特殊的队列数据结构,它的核心特征在于元素的出队顺序不是按照它们进入队列的先后顺序,而是...理解并掌握优先队列的原理和实现方法,对于提升算法设计和问题解决能力具有重要意义。
下面我们将详细探讨基于Java优先队列的多路排序算法及其工作原理。 首先,理解多路归并排序的基本概念是关键。在多路归并排序中,我们首先将原始数据分割成若干个子序列,每个子序列都进行单独排序,然后利用优先...
**优先队列的实现原理** 优先队列通常用二叉堆来实现,即每个父节点的值都大于或等于其子节点的值(最大堆)或小于或等于其子节点的值(最小堆)。在C#中,`System.Collections.Generic`命名空间下的`PriorityQueue`...
但是基于题目要求,我们可以从“优先队列”这个概念出发,结合代码中涉及的技术背景(如公钥/私钥对的生成等),来探讨优先队列在计算机科学中的基本原理及其应用。 ### 优先队列概述 优先队列(Priority Queue)...
优先队列是一种特殊的数据结构,它在处理问题时具有较高的效率,特别是在需要频繁进行查找最大或最小元素并删除这些...通过学习这部分内容,你可以深入理解优先队列的工作原理,提高在算法设计和数据结构使用上的能力。
实验的目的在于让学生熟悉优先队列的原理和实现,以及如何在实际问题中应用这些概念。 实验内容可能包括设计和实现优先队列的数据结构,如构建和维护堆,插入元素,删除最小元素(extract-min),以及调整堆以保持...
优先队列是一种特殊的数据结构,与传统的FIFO(先进先出)队列不同,它的主要特征在于元素的出队顺序取决于它们的优先级,而非入队的先后顺序。优先队列通常分为最小优先队列和最大优先队列,前者优先出队的是优先级...
首先,C++标准库提供了`<queue>`和`<priority_queue>`头文件,用于实现常规队列和优先队列。优先队列不像普通队列那样遵循先进先出(FIFO)原则,而是根据元素的优先级决定哪个元素先出队。优先级高的元素会优先处理...
### 优先队列与分支限界算法 #### 1. 基本思想:队列式(FIFO)分支限界法与优先队列式分支限界法 **分支限界法**是一种常用的优化搜索方法,它与**回溯法**在解决实际问题时有着本质的区别。回溯法的目标通常是寻找...