`
cuisuqiang
  • 浏览: 3958977 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3669035
社区版块
存档分类
最新评论

优先级队列:PriorityQueue

    博客分类:
  • JDK
阅读更多

PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于优先级堆的极大优先级队列。优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列(参阅 Comparable),也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)
优先级队列是无界的,但是有一个内部容量,控制着用于存储队列元素的数组大小。它通常至少等于队列的大小。随着不断向优先级队列添加元素,其容量会自动增加。无需指定容量增加策略的细节

简单应用:

package test;
import java.util.PriorityQueue;
public class PriorityQueueTest1 {
 @SuppressWarnings("unchecked")
 public static void main(String[] args) {
  PriorityQueue queue = new PriorityQueue();
  queue.add("AAAAA"); // Add接受的参数是Obj,PriorityQueue使用integer String等基本的数据类型时,默认new时有参数,如果不写则是按照默认排序
  queue.add("BBBBB"); 
  queue.add("CCCCC"); 
  queue.add("DDDDD"); 
  
  System.out.println(queue.peek()); // 获取但不移除此队列的头
  System.out.println(queue.poll()); // 获取并移除此队列的头
  System.out.println(queue.poll());
  
  queue.offer("ZZZZZ"); // 将指定的元素插入此优先级队列
  
  System.out.println(queue.poll());
  System.out.println(queue.poll());
  System.out.println(queue.poll());
  
  System.out.println(queue.poll()); // 到这里已经没有元素,打印Null
 }
}

 

定义比较器:

package test;
import java.util.Comparator;
import java.util.PriorityQueue;
@SuppressWarnings("unchecked")
public class PriorityQueueTest2 {
 private static PriorityQueue queue = new PriorityQueue(10,new Comparators());
 public static void main(String[] args) {
  QueueObject queueObject = new QueueObject();
  queueObject.setId(4);
  queueObject.setObject("AAAAA");
  queue.add(queueObject);
  QueueObject queueObject1 = new QueueObject();
  queueObject1.setId(1);
  queueObject1.setObject("BBBBB");
  queue.add(queueObject1);
  QueueObject queueObject2 = new QueueObject();
  queueObject2.setId(3);
  queueObject2.setObject("CCCCC");
  queue.add(queueObject2);
  
  System.out.println(((QueueObject)queue.poll()).getObject());
  System.out.println(((QueueObject)queue.poll()).getObject());
  System.out.println(((QueueObject)queue.poll()).getObject());
 }
}
class QueueObject {
    private int id;
    private Object object;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Object getObject() {
        return object;
    }
    public void setObject(Object object) {
        this.object = object;
    }
}
@SuppressWarnings("unchecked")
class Comparators implements Comparator{
    public int compare(Object arg0, Object arg1) {
        int val1 = ((QueueObject)arg0).getId();
        int val2 = ((QueueObject)arg1).getId();
        return val1 < val2 ? 0 : 1;
    }
}

 

注意事项:
注意1:该队列是用数组实现,但是数组大小可以动态增加,容量无限。
注意2:此实现不是同步的。不是线程安全的。如果多个线程中的任意线程从结构上修改了列表, 则这些线程不应同时访问 PriorityQueue 实例,这时请使用线程安全的PriorityBlockingQueue 类。
注意3:不允许使用 null 元素。
注意4:此实现为插入方法(offer、poll、remove() 和 add 方法)提供 O(log(n)) 时间;
为 remove(Object) 和 contains(Object) 方法提供线性时间;
为检索方法(peek、element 和 size)提供固定时间。
注意5:方法iterator()中提供的迭代器并不保证以有序的方式遍历优先级队列中的元素。
至于原因可参考下面关于PriorityQueue的内部实现
如果需要按顺序遍历,请考虑使用 Arrays.sort(pq.toArray())。
注意6:可以在构造函数中指定如何排序。如:
PriorityQueue()
使用默认的初始容量(11)创建一个 PriorityQueue,并根据其自然顺序来排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity)
使用指定的初始容量创建一个 PriorityQueue,并根据其自然顺序来排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity, Comparator comparator)
使用指定的初始容量创建一个 PriorityQueue,并根据指定的比较器comparator来排序其元素。
注意7:此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选 方法。
PriorityQueue的内部实现
PriorityQueue对元素采用的是堆排序,头是按指定排序方式的最小元素。堆排序只能保证根是最大(最小),整个堆并不是有序的。
方法iterator()中提供的迭代器可能只是对整个数组的依次遍历。也就只能保证数组的第一个元素是最小的 

 

请您到ITEYE网站看 java小强 原创,谢谢!

http://cuisuqiang.iteye.com/ 

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

分享到:
评论

相关推荐

    优先级队列头文件priorityqueue.h

    优先级队列头文件priorityqueue.h

    优先级队列cpp文件PriorityQueue.cpp

    优先级队列cpp文件PriorityQueue.cpp

    优先级队列(堆实现)

    在Java中,优先级队列是通过`java.util.PriorityQueue`类来实现的,它基于一个二叉堆(Binary Heap)的数据结构。本文将深入探讨优先级队列的概念、实现方式以及如何在实际编程中使用。 首先,理解二叉堆是理解...

    PriorityQueue-MEX-Matlab 优先级队列 matlab

    总结来说,“PriorityQueue-MEX-Matlab”是一个利用MEX技术在MATLAB中实现的优先级队列库,它提供了一套高效的接口,便于在MATLAB环境中进行优先级队列的操作,如插入、删除和查询等。这个项目可能还包括了一些示例...

    一个用堆实现的优先级队列

    优先级队列是一种特殊的数据结构,它按照优先级顺序存储元素,最高优先级的元素总是在队列的前端。在计算机科学中,堆通常被用来实现优先级队列。堆是一种完全二叉树,其中每个父节点的值都大于或等于(最大堆)或...

    毕业设计MATLAB_优先级队列.zip

    PriorityQueue.m是MATLAB脚本或函数文件,很可能包含了优先级队列的实现代码。license.txt通常包含软件许可信息,说明了这些源代码的使用条件和限制。ignore.txt则可能是Git或版本控制系统中的忽略文件,指定了在...

    JAVA:PriorityQueue

    - **PriorityQueue(PriorityQueue&lt;? extends E&gt; c)**:创建包含指定优先级队列元素的`PriorityQueue`。 - **PriorityQueue(SortedSet&lt;? extends E&gt; c)**:创建包含指定有序集元素的`PriorityQueue`。 #### 方法介绍...

    Java优先队列(PriorityQueue)示例Java

    Java的优先队列(PriorityQueue)是Java集合框架中一个重要的数据结构,它是一个基于堆实现的无界队列。优先队列中的元素按照优先级排序,最高的优先级元素总是在队列的头部。在Java中,PriorityQueue类位于`java....

    Python实现一个优先级队列的方法

    下面的类利用 heapq 模块实现了一个简单的优先级队列: import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push(self, item, priority): heapq.heappush(self._...

    排队matlab代码-MatlabPriorityQueue:为Matlab编写的优先级队列

    《MatlabPriorityQueue: 为Matlab编写的优先级队列》 在计算机科学中,优先级队列是一种特殊的数据结构,它允许我们按照优先级处理元素,而非按照它们进入队列的顺序。这种数据结构在许多算法和应用中都扮演着关键...

    基于java优先队列(PriorityQueue)的多路排序算法(含代码)

    在Java编程中,优先队列(PriorityQueue)是一种特殊的队列,它按照元素的优先级进行出队。这种数据结构在实现多路归并排序(Multi-Merge Sort)时非常有用,因为它能有效地处理多个已排序的输入流,并将它们合并成...

    java使用小根堆实现优先级队列的几种方式

    - **内部实现**:Java的`PriorityQueue`类已经实现了小根堆,我们可以通过直接使用这个类来创建优先级队列,如`PriorityQueue&lt;Integer&gt; queue = new PriorityQueue();`,然后可以调用`offer()`、`poll()`等方法进行...

    解析Java中PriorityQueue优先级队列结构的源码及用法

    优先级队列的核心特性包括: 1. **数据结构**:PriorityQueue使用二叉堆作为其数据结构,通常是一个最小堆,保证队头元素是最小的。 2. **比较规则**:队列中的元素必须实现Comparable接口,或者在创建队列时提供...

    .NETPriorityQueue:使用C#中的二进制堆的自定义通用优先级队列实现。 (据我所知)它符合大多数.NET标准。不是线程安全的

    使用C#中的二进制堆的自定义优先级队列实现。为个人/俱乐部项目编写。 (据我所知)它符合大多数.NET标准。不是线程安全的。 信息 这段代码是从Java项目转换为利用C#功能集并在结构上更合理的东西。虽然原始的Java...

    数据结构 C++ 实现

    ### 7、优先级队列:PriorityQueue.h 优先级队列是一种特殊类型的队列,其中元素根据其优先级进行排序。通常使用堆数据结构来实现高效的操作,如插入和查找最高优先级的元素。 ### 8、串:MyString.h 字符串(串...

    Java队列源码-priority-queue:Java中优先级队列实现的源代码

    Java中的优先级队列(PriorityQueue)是一种特殊的队列,它按照元素的优先级进行排序。在Java集合框架中,PriorityQueue是位于java.util包下的一个类,它实现了Queue接口,但并不保证按照先进先出(FIFO)的顺序进行...

    Java队列源码-simulation-queue-priory-pso:文章“队列优先级优化算法:用于集成过程的新颖任务调度”的源代码(Ja

    优先级队列在Java中通过`java.util.PriorityQueue`类实现,这个类是一个无界并发容器,它不保证队列的元素顺序,而是基于最小堆的数据结构来维护元素的顺序,使得每次删除元素时都是当前队列中优先级最高的元素。...

    Java超详细!Java实现数据结构PPT课件

    复杂度 时间复杂度 空间复杂度 线性数据结构动态数组(ArrayList) 链表(LinkedList) 单向链表 双向链表 循环链表 静态链表 栈(Stack) 队列(Queue) 双端队列(Deque) ...优先级队列(PriorityQueue)

    算法面试通关40讲完整课件 11-13 优先队列(PriorityQueue)

    优先队列(PriorityQueue)是数据结构中的一种特殊类型,它在处理元素的插入和删除时,不遵循传统的先进先出(FIFO)或后进先出(LIFO)原则,而是根据元素的优先级来决定操作顺序。在许多算法问题和实际应用中,...

Global site tag (gtag.js) - Google Analytics