聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

【天天熱聞】PriorityQueue(優先隊列)是堆還是最小?PriorityQueue詳解

來源:CSDN 時間:2023-03-02 09:49:31

優先隊列

PriorityQueue(優先隊列)采用的是堆排序, 實際上是一個堆(不指定Comparator時默認為最小堆) 隊列既可以根據元素的自然順序來排序,也可以根據 Comparator來設置排序規則。 隊列的頭是按指定排序方式的最小元素。如果多個元素都是最小值,則頭是其中一個元素。 新建對象的時候可以指定一個初始容量,其容量會自動增加。


(資料圖片)

注意1:該隊列是用數組實現,但是數組大小可以動態增加,容量無限。

注意2:隊列的實現不是同步的。不是線程安全的。如果多個線程中的任意線程從結構上修改了列表, 則這些線程不應同時訪問 PriorityQueue實例。保證線程安全可以使用PriorityBlockingQueue 類。

注意3:不允許使用 null 元素。

注意4:插入方法(offer()、poll()、remove() 、add() 方法)時間復雜度為O(log(n)) ;remove(Object) 和 contains(Object) 時間復雜度為O(n);檢索方法(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對元素采用的是堆排序,頭是按指定排序方式的最小元素。堆排序只能保證根是最大(最?。?,整個堆并不是有序的。方法iterator()中提供的迭代器可能只是對整個數組的依次遍歷。也就只能保證數組的第一個元素是最小的。

因此使用方法提供iterator()的不保證是以有序的方式遍歷優先級隊列的元素 示例:自己指定比較器進行排序

@Testpublic void testPriorityQueue(){//默認采用的是最小堆實現的    PriorityQueuequeue = new PriorityQueue(10,new Comparator(){public int compare(Integer a, Integer b){return a-b; //if a>b 則交換,so這是遞增序列        }    });    queue.offer(13);    queue.offer(9);    int len = queue.size();    for(int i=0;i<LEN;I++){System.out.println(queue.poll());    }    //輸出 9  13    //默認采用的是最小堆實現的    PriorityQueuequeue2 = new PriorityQueue<>(10);    queue2.offer(11);    queue2.offer(9);    len = queue2.size();    for(int i=0;iSystem.out.println(queue2.poll());    }    //輸出 9, 11    }

完整例子:

public class PriorityQueueTest{public static void main(String args[]){PriorityQueuequeue = new PriorityQueue(11,                  new Comparator() {public int compare(People p1, People p2) {return p2.age - p1.age;                    }                  });                             for (int i = 1; i <= 10; i++) {queue.add(new People("張"+ i, (new Random().nextInt(100))));          }          while (!queue.isEmpty()) {System.out.println(queue.poll().toString());          }      }  }    class People {String name;      int age;      public People(String name, int age){this.name = name;          this.age = age;      }          public String toString() {return "姓名:"+name + " 年齡:" + age;      }  }

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 岛国精品在线