优先队列的java实现
注:当时写好之后忘了检查,这个优先队列有点缺陷~~~嘻嘻,不过我在工作环境中已经作了修改
package test;
import java.util.Comparator;
/**
* @作用:优先队列
* @author henry
* @date 2010-4-30
*/
public class PriQueue<E> {
private static int DEFAULT_CAPECITY = 11;
private Object[] objs;
private Comparator<? super E> comparator;
private int size = 0;
public PriQueue() {
this(DEFAULT_CAPECITY, null);
}
public PriQueue(Comparator<? super E> comparator) {
objs = new Object[DEFAULT_CAPECITY];
this.comparator = comparator;
}
public PriQueue(int capecity, Comparator<? super E> comparator) {
if (capecity < 0) {
throw new IllegalArgumentException();
}
objs = new Object[++capecity];
this.comparator = comparator;
heapfix();
}
public PriQueue(int capecity) {
this(capecity, null);
}
private void heapfix() {
if (objs != null) {
return;
}
for (int i = size >> 1; i > 0; i--) {
fixdown(i);
}
}
/**
* 插入数据
* @param o
*/
public void add(E o) {
if (o == null) {
throw new NullPointerException("你插入了一个空对象");
}
if (size > Integer.MAX_VALUE) {
throw new OutOfMemoryError("数组爆了,不能再插入!");
}
if (++size >= objs.length) {
grow(size);
}
objs[size] = o;
fixup(size);
}
/**
* 交换数据
* @param i
* @param k
*/
private void exchange(int i, int k) {
if (i < 1 || k < 1 || i > Integer.MAX_VALUE || k > Integer.MAX_VALUE) {
throw new IllegalArgumentException();
}
Object tmp = objs[i];
objs[i] = objs[k];
objs[k] = tmp;
}
/**
* 比较节点数据
* @param o1
* @param o2
* @return int
*/
@SuppressWarnings("unchecked")
public int compare(E o1, E o2) {
if (this.comparator != null) {
return this.comparator.compare(o1, o2);
} else {
return ((Comparable<E>) o1).compareTo(o2);
}
}
/**
* 增长队列
* @param index
*/
public void grow(int index) {
if (index > Integer.MAX_VALUE) {
throw new IllegalArgumentException("插入太多了~~");
}
int newLen = objs.length;
if (index < newLen) {
return;
}
if (newLen < index) {
if (newLen < Integer.MAX_VALUE >> 1) {
newLen = Integer.MAX_VALUE;
} else {
newLen <<= 1;//如果index > newLen,至少超出数组界限两位
}
}
Object[] tmp = new Object[newLen + 1];
System.arraycopy(objs, 0, tmp, 0, objs.length);
objs = tmp;
}
/**
* 最大堆排序
* @param index
*/
@SuppressWarnings("unchecked")
private void fixup(int index) {
if (index <= 1 || index > Integer.MAX_VALUE) {
return;
}
int p = index >>> 1;
if (compare((E) objs[p], (E) objs[index]) < 0) {
exchange(p, index);
}
fixup(p);
}
/**
* 最小堆排序
* @param i
*/
@SuppressWarnings("unchecked")
private void fixdown(int i) {
if (i >= size) {
return;
}
int largest = i;
int left = i << 1;
int right = left + 1;
if (left > size) {
return;
}
if (right > size) {
right = left;
}
if (compare((E) objs[largest], (E) objs[left]) < 0) {
largest = left;
}
if (compare((E) objs[largest], (E) objs[right]) < 0) {
largest = right;
}
if (i != largest) {
exchange(i, largest);
fixdown(largest);
}
}
/**
* 检查队列是否还有数据
* @return boolean
*/
public boolean isHasElement() {
if (size > 0) {
return true;
}
return false;
}
/**
* 获取数据,但不会移除数据
* @param index
* @return Object
*/
public Object get(int index) {
if (index > size || index < 0) {
throw new IllegalArgumentException();
}
return objs[index + 1];
}
/**
* 获取数据,并移除队列的头部
* @return
*/
public Object poll() {
if (objs.length > 1)
return remove(1);
return null;
}
/**
* 获取指定位置的数据,并移除
* @param i
* @return
*/
public Object remove(int i) {
if (i > Integer.MAX_VALUE) {
throw new OutOfMemoryError("索引值过大");
}
if(i > size) {
throw new OutOfMemoryError("超出队列范围");
}
if (i < 1) {
return null;
}
exchange(i, size);
--size;
fixdown(i);
return objs[size + 1];
}
/**
* 移除指定元素,并取之
* 不存在该元素,则返回null
* @param o
* @return
*/
@SuppressWarnings("unchecked")
public Object remove(E o) {
for(int i = 0; i < objs.length; i++) {
if(this.compare(o, (E)objs[i]) == 0) {
return remove(i);
}
}
return null;
}
public static void main(String[] args) {
int[] arr = { 1, 5, 2, 33, 20, 11, 8 };
PriQueue<Integer> q = new PriQueue<Integer>(5);
for (int a : arr) {
q.add(a);
}
System.out.println("最大堆:");
for (int i = 0; i < arr.length; i++) {
System.out.print(q.get(i) + " ");
}
System.out.println();
System.out.println("最小堆:");
StringBuilder sb = new StringBuilder();
while (q.isHasElement()) {
sb.append(q.poll() + " ");
}
System.out.println(sb.toString());
}
}
分享到:
相关推荐
优先队列在Java编程中是一种特殊的数据结构,它遵循特定的出队顺序,通常是最小元素(最小优先队列)或最大元素(最大优先队列)先出队。这种数据结构在解决各种问题时非常有用,例如任务调度、事件驱动编程、搜索...
在Java中,我们可以使用数组来实现优先队列。这篇文章将探讨如何利用数组实现优先队列,并通过提供的`PriorityQ.java`文件来深入理解其实现原理。 1. **优先队列基本概念** 优先队列是一种数据结构,它维护了一个...
- Java的`java.util.PriorityQueue`是优先队列的实现,它基于二叉堆(通常是最小堆),满足堆的性质:父节点的优先级总是不小于子节点。 - PriorityQueue支持`add()`、`offer()`、`peek()`、`poll()`等方法,分别...
PriorityQueue.java 可能是实现了优先队列类,而 PQTest.java 可能是用来测试该优先队列功能的代码。 1. **PriorityQueue类**: - **构造函数**:可能会包含一个无参构造函数,用于创建空的优先队列,也可能有带...
在Java编程中,优先队列(PriorityQueue)是一种特殊的队列,它按照元素的优先级进行出队。这种数据结构在实现多路归并排序(Multi-Merge Sort)时非常有用,因为它能有效地处理多个已排序的输入流,并将它们合并成...
在这个话题中,我们将深入探讨与“简单的优先队列”相关的几个核心概念,包括平衡树、背包、图的结构,以及Java中的相关实现。 1. 平衡树: 平衡树是一种自平衡二叉查找树,如AVL树或红黑树。它们保证了任何节点的...
在编程语言中,很多库提供了优先队列的实现,例如C++中的`<queue>`库和`<priority_queue>`模板,Java的`java.util.PriorityQueue`类,Python的`heapq`模块等。这些库通常提供上述的基本操作,并且性能高效,因为它们...
在这个“多级优先队列.zip”压缩包中,提供了一个用Java实现的多级反馈队列模型,并带有图形用户界面(GUI),使得理解和学习变得更加直观。 多级优先队列的基本思想是将任务或请求分配到多个队列中,每个队列对应...
Java的优先队列(PriorityQueue)是Java集合框架中一个重要的数据结构,它是一个基于堆实现的无界队列。优先队列中的元素按照优先级排序,最高的优先级元素总是在队列的头部。在Java中,PriorityQueue类位于`java....
4. **PriorityQueue**:不同于普通队列,PriorityQueue 是一个优先队列,元素按照其自然排序顺序或自定义比较器进行排序。插入元素时,队列会自动调整元素顺序。 队列在实际应用中广泛用于任务调度、事件处理、缓冲...
数据结构与算法第六章,优先队列,heap_maximum 返回优先队列的最大值 heap_extract_max 删除并返回最大值 max_heap_insert插入值为key的元素进优先队列中 。
6. **Java中的优先队列**:在Java编程语言中,`java.util.PriorityQueue`类提供了优先队列的实现。它可以存储任何实现了`Comparable`接口的对象,或者在创建时提供一个自定义的比较器。 7. **C++中的优先队列**:在...
在java实现中,使用了FIFO队列来存储可能的解决方案,并使用剪枝函数来减少搜索空间。Java实现的主要步骤包括: 1. 初始化FIFO队列和剪枝函数。 2. 生成可能的解决方案,并将其存储在FIFO队列中。 3. 使用剪枝函数...
分支限界法中的优先队列式分支限界法解装载问题
- **广度优先搜索(BFS)**:在图或树的搜索算法中,队列常用来遍历节点。 理解并熟练运用这些数据结构是提升编程能力的关键,无论是解决问题还是优化代码性能。通过Java实现不同的队列结构,可以更好地适应各种...
在编程语言中,很多都内置了优先队列的库或模块,例如Python的`heapq`模块,Java的`PriorityQueue`类,C++的`priority_queue`容器等,这些工具方便开发者直接使用优先队列功能。 总的来说,优先队列作为数据结构的...
在Java编程语言中,优先队列(PriorityQueue)和堆(Heap)是两种重要的数据结构,它们在处理具有优先级的元素时非常有用。本文将深入探讨这些概念,并结合题目"POJ 2442"来理解它们的应用。 首先,优先队列是一种...
7. **Java编程**:在Java中,可以使用`java.util.PriorityQueue`实现优先队列,`ArrayList`或`HashSet`用于存储节点和邻居,`Node`类封装节点信息,包括位置、成本、启发式值和前驱节点。同时,需要编写合适的比较器...
Java堆和优先队列 Java堆和优先队列是数据结构中两个重要的概念,在Java编程中经常被使用。在本文中,我们将详细介绍Java堆和优先队列的定义、实现和应用。 一、堆(Heap) 堆是一种特殊的二叉树,它能够实现优先...
在这个主题中,我们将深入探讨Java实现的三种基本数据结构:堆栈(Stack)、队列(Queue)和列表(List)。这些概念是计算机科学的核心部分,对理解和解决复杂问题至关重要。 1. **堆栈(Stack)**: - 堆栈是一种...