【Java】 用PriorityQueue實現最大最小堆

PriorityQueue(優先隊列),一個基於優先級堆的無界優先級隊列

實際上是一個堆(不指定Comparator時默認爲最小堆),通過傳入自定義的Comparator函數可以實現大頂堆。

PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小頂堆,默認容量爲11

PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ //大頂堆,容量11

    @Override

    public int compare(Integer i1,Integer i2){

        return i2-i1;

    }

});

 

  案例: 劍指offer(41) 最小的k個數

PriorityQueue的常用方法有:poll(),offer(Object),size(),peek()等。

  •   插入方法(offer()、poll()、remove() 、add() 方法)時間複雜度爲O(log(n)) ;
  •   remove(Object) 和 contains(Object) 時間複雜度爲O(n);
  •   檢索方法(peek、element 和 size)時間複雜度爲常量。

 

 PriorityQueue的API文檔說明:

構造方法摘要
PriorityQueue()
          使用默認的初始容量(11)創建一個 PriorityQueue,並根據其自然順序對元素進行排序。
PriorityQueue(Collection<? extends E> c)
          創建包含指定 collection 中元素的 PriorityQueue
PriorityQueue(int initialCapacity)
          使用指定的初始容量創建一個 PriorityQueue,並根據其自然順序對元素進行排序。
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
          使用指定的初始容量創建一個 PriorityQueue,並根據指定的比較器對元素進行排序。
PriorityQueue(PriorityQueue<? extends E> c)
          創建包含指定優先級隊列元素的 PriorityQueue
PriorityQueue(SortedSet<? extends E> c)
          創建包含指定有序 set 元素的 PriorityQueue

 

方法摘要
 boolean add(E e)
          將指定的元素插入此優先級隊列。
 void clear()
          從此優先級隊列中移除所有元素。
 Comparator<? super E> comparator()
          返回用來對此隊列中的元素進行排序的比較器;如果此隊列根據其元素的自然順序進行排序,則返回 null
 boolean contains(Object o)
          如果此隊列包含指定的元素,則返回 true
 Iterator<E> iterator()
          返回在此隊列中的元素上進行迭代的迭代器。
 boolean offer(E e)
          將指定的元素插入此優先級隊列。
 E peek()
          獲取但不移除此隊列的頭;如果此隊列爲空,則返回 null。
 E poll()
          獲取並移除此隊列的頭,如果此隊列爲空,則返回 null。
 boolean remove(Object o)
          從此隊列中移除指定元素的單個實例(如果存在)。
 int size()
          返回此 collection 中的元素數。
 Object[] toArray()
          返回一個包含此隊列所有元素的數組。
<T> T[]
toArray(T[] a)
          返回一個包含此隊列所有元素的數組;返回數組的運行時類型是指定數組的類型。

 

從類 java.util.AbstractQueue 繼承的方法
addAllelementremove

 

從類 java.util.AbstractCollection 繼承的方法
containsAllisEmptyremoveAllretainAlltoString

 

從類 java.lang.Object 繼承的方法
cloneequalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait

 

從接口 java.util.Collection 繼承的方法
containsAllequalshashCodeisEmptyremoveAllretainAll
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章