優先順序佇列是一種什麼樣的資料結構
http://www.importnew.com/6510.html
優先順序佇列(PriprityQueue)是一種無界佇列,基於優先順序堆,它的元素根據自然順序或者通過實現Comparator介面的自定義排序方式進行排序。這篇文章,我們將建立一個Items的優先順序佇列,基於價格排序,優先順序佇列用來實現迪科斯徹演算法(Dijkstra algorithm)非常實用。值得注意的是他的迭代器並不保證有序,如果需要按順序遍歷,最好使用Arrays.sort(pd.toArray())方法。同時它的實現不是同步的,意味著在多執行緒中不是執行緒安全的物件,可以取而代之的是PriorityBlockingQueue,它能用於多執行緒環境。優先順序佇列提供了O(log(n))時間在出隊和入隊的方法上,比如:offer(),poll(),add(),但是對於檢索操作如:peek(),element()提供的是常量(固定)時間。
如何使用PriorityQueue
這裡是如何使用PriorityQueue的一個例子,如上所說,你可以使用特定的順序來組織元素,可以是自然順序或者元素實現Comparator介面,這個例子中,我們把Items物件放入優先順序佇列中,按照價格排序,你可以注意下Item類的compareTo方法,它與equals方法是保持一致的,這裡把Item類作為內部靜態類,把item儲存在優先順序佇列中,你可以一直使用poll()方法獲取價格最低的那個item。
import java.util.PriorityQueue;
import java.util.Queue;
public class test2 {
public static void main(String args[]) {
Queue<Item> items = new PriorityQueue<Item>();
items.add(new Item("IPone", 900));
items.add(new Item("IPad", 1200));
items.add(new Item("Xbox", 300));
items.add(new Item("Watch", 200));
System.out.println("Order of items in PriorityQueue");
System.out.println(items);
System.out.println("Element consumed from head of the PriorityQueue : " + items.poll());
System.out.println(items);
System.out.println("Element consumed from head of the PriorityQueue : " + items.poll());
System.out.println(items);
System.out.println("Element consumed from head of the PriorityQueue : " + items.poll());
System.out.println(items);
//items.add(null); // null elements not allowed in PriorityQueue - NullPointerException
}
private static class Item implements Comparable<Item> {
private String name;
private int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Item other = (Item) obj;
if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
return false;
}
if (this.price != other.price) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = hash + (this.name != null ? this.name.hashCode() : 0);
hash = hash + this.price;
return hash;
}
@Override
public int compareTo(Item i) {
if (this.price == i.price) {
return this.name.compareTo(i.name);
}
return this.price - i.price;
}
@Override
public String toString() {
return String.format("%s: $%d", name, price);
}
}
}
output:
Order of items in PriorityQueue
[Watch: $200, Xbox: $300, IPone: $900, IPad: $1200]
Element consumed from head of the PriorityQueue : Watch: $200
[Xbox: $300, IPad: $1200, IPone: $900]
Element consumed from head of the PriorityQueue : Xbox: $300
[IPone: $900, IPad: $1200]
Element consumed from head of the PriorityQueue : IPone: $900
[IPad: $1200]
從上面的輸出結果可以很清晰的看到優先順序物件始終把最小的值儲存在頭部,它的排序規則取決於compareTo()方法,儘管它不一定所有元素都是按序排列的,但是它能保證佇列的頭一定是最小的元素,這也是TreeSet和PriorityQueue的區別,前者能保證所有元素按序排列,而優先順序佇列僅僅保證列的頭是有序的,另一個需要注意的地方是PriorityQueue並不允許null元素存在,如果嘗試新增null值,那麼就會丟擲NullPointException異常:
Exception in thread "main" java.lang.NullPointerException
at java.util.PriorityQueue.offer(PriorityQueue.java:265)
at java.util.PriorityQueue.add(PriorityQueue.java:251)
at test.PriorityQueueTest.main(PriorityQueueTest.java:36)
Java Result: 1
總結:
和所有其他集合類一樣,值得注意一下幾點:
- 優先順序佇列不是同步的,如果需要保證執行緒安全那麼請使用PriorityBlockingQueue
- 佇列的獲取操作如poll(),peek()和element()是訪問的佇列的頭,保證獲取的是最小的元素(根據指定的排序規則)
- 返回的迭代器並不保證提供任何的有序性
- 優先順序佇列不允許null元素,否則丟擲NullPointException。
以上所有就是有關優先順序佇列的全部,它是一個很特別的類,用在一些特性的情景。記住:BlockingQueue維持的是插入的順序,如果想維持自定義的順序PriorityQueue或者PriorityBlockingQueue是正確的選擇,TreeSet提供類似的功能,但是沒有類似的檢索+移除的方法:poll()
相關文章
- 【資料結構】堆排序和模擬實現優先順序佇列!!資料結構排序佇列
- 封裝優先順序佇列封裝佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- Redis實現任務佇列、優先順序佇列Redis佇列
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- Facebook的分散式優先順序佇列FOQS分散式佇列
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- 【資料結構】順序佇列的實現(c++)資料結構佇列C++
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- [PY3]——實現一個優先順序佇列佇列
- 佇列的順序儲存結構佇列
- 【資料結構】回顧優先佇列(堆)資料結構佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- 個推基於 Apache Pulsar 的優先順序佇列方案Apache佇列
- RMQ——支援合併和優先順序的訊息佇列MQ佇列
- 資料結構與演算法分析 (優先佇列)資料結構演算法佇列
- 美團二面:SpringBoot讀取配置優先順序順序是什麼?Spring Boot
- [演算法系列之四]優先順序佇列演算法佇列
- 資料型別優先順序資料型別
- Python 列表推導及優先順序佇列的實現Python佇列
- 資料結構之PHP(最大堆)實現優先佇列資料結構PHP佇列
- Python3 執行緒優先順序佇列( Queue)Python執行緒佇列
- 原始碼解析C#中PriorityQueue(優先順序佇列)的實現原始碼C#佇列
- 演算法與資料結構番外(1):優先佇列演算法資料結構佇列
- 優先佇列的一種實現方式—堆佇列
- 何為CSS 樣式優先順序CSS
- gitignore優先順序小結Git
- 『演算法與資料結構』優先佇列 二叉堆演算法資料結構佇列
- uva 11995 棧,佇列,優先佇列,等基本資料結構的應用與理解佇列資料結構
- CSS優先順序CSS
- java資料結構基礎-利用Heap(堆)實現PriorityQueue(優先佇列)Java資料結構佇列
- 基於EasyNetQ封裝RabbitMQ,優先順序郵件服務佇列封裝MQ佇列
- 資料結構-佇列資料結構佇列
- 【資料結構-----佇列】資料結構佇列
- 資料結構 - 佇列資料結構佇列
- 關於CSS樣式的優先順序問題CSS
- 佇列-順序儲存佇列
- 順序佇列基本操作佇列