Chinaunix首页 | 论坛 | 博客
  • 博客访问: 435652
  • 博文数量: 62
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 740
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-10 21:59
个人简介

付出,终有回报!

文章分类

全部博文(62)

文章存档

2018年(6)

2017年(24)

2016年(6)

2015年(26)

分类: Java

2016-01-11 20:51:09

    优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。
    PriorityQueue是从JDK1.5开始提供的新的数据结构接口。

点击(此处)折叠或打开

  1. import java.util.PriorityQueue;


  2. public class WK {
  3.     
  4.     public static void main(String[] args) {
  5.         PriorityQueue<String> pq = new PriorityQueue<String>();
  6.         
  7.         pq.add("dog");
  8.         pq.add("apple");
  9.         pq.add("fox");
  10.         pq.add("easy");
  11.         pq.add("boy");
  12.         
  13.         while (!pq.isEmpty()) {
  14.             for (String s : pq) {
  15.                 System.out.print(s + ","+" ");
  16.             }
  17.             
  18.             System.out.println();
  19.             System.out.println("pq.poll(): " + pq.poll());
  20.             System.out.println();
  21.         }
  22.     }
  23. }
输出的结果如下:

apple, boy, fox, easy, dog,
pq.poll(): apple

boy, dog, fox, easy,
pq.poll(): boy

dog, easy, fox,
pq.poll(): dog

easy, fox,
pq.poll(): easy

fox,
pq.poll(): fox
可以看到,虽然PriorityQueue保持了队列顶部元素总是最小,但内部的其它元素的顺序却随着元素的减少始终处于变化之中。
PriorityQueue是个基于优先级堆的极大优先级队列

此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable),也可以根据 Comparator 来指定,这取决于使用哪种构造方法。
优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。
此队列的头是按指定排序方式的最小元素。如果多个元素都是最小值,则头是其中一个元素——选择方法是任意的。
队列检索操作 poll、remove、peek 和 element 访问处于队列头的元素。
优先级队列是无界的,但是有一个内部容量,控制着用于存储队列元素的数组的大小。它总是至少与队列的大小相同。随着不断向优先级队列添加元素,其容量会自动增加。无需指定容量增加策略的细节。

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


阅读(1573) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~