PriorityQueue(優先隊列)


PriorityQueue

翻譯過來就是優先隊列,本質是一個堆, 默認情況下堆頂每次都保留最小值,每插入一個元素,仍動態維護堆頂為最小值。

PriorityQueue 一個基於優先級的無界優先級隊列。優先級隊列的元素按照其自然順序進行排序,或者根據構造隊列時提供的 Comparator 進行排序,具體取決於所使用的構造方法。該隊列不允許使用 null 元素也不允許插入不可比較的對象(沒有實現Comparable接口的對象)。
PriorityQueue 隊列的頭指排序規則最小那個元素。如果多個元素都是最小值則隨機選一個。
PriorityQueue 是一個無界隊列,但是初始的容量(實際是一個Object[]),隨着不斷向優先級隊列添加元素,其容量會自動擴容,無需指定容量增加策略的細節。

初始化

PriorityQueue()//使用默認的初始容量(11)創建一個 PriorityQueue,並根據其自然順序對元素進行排序。

PriorityQueue<Integer> Q = new PriorityQueue<>(); // 初始化

常用函數

add(E e)//將指定的元素插入此優先級隊列。
clear()//清空
contains(Object o) // 如果包含指定元素返回true
iterator()//返回在此隊列中的元素上進行迭代的迭代器。
offer(E e) // 將指定元素插入此優先隊列
peek() // 獲取第一個元素,及最小或最大元素
poll() // 獲取並移除第一個
remove(Object o) // 移除指定元素
size() // 返回元素個數

基本使用

public class Main {
    public static void main(String[] args) {
        PriorityQueue<String> q = new PriorityQueue<>();
        //入列
        q.offer("1");
        q.offer("2");
        q.offer("5");
        q.offer("3");
        q.offer("4");

        //出列
        System.out.println(q.poll());  //1
        System.out.println(q.poll());  //2
        System.out.println(q.poll());  //3
        System.out.println(q.poll());  //4
        System.out.println(q.poll());  //5
    }
}

PriorityQueue使用跟普通隊列一樣,唯一區別是PriorityQueue會根據排序規則決定誰在隊頭,誰在隊尾。

實現大根堆的兩種方式

  1. 使用自定義比較器Comparator
  2. 將所有數據變為之前自身的負數之后在插入, 因為添加個負號就相當於是逆序了嘛。1 < 2 < 3 取負之后變為 -1 > - 2 > - 3

實例

public static void main(String[] args){
		Scanner in = new Scanner(new InputStreamReader(System.in));
		PriorityQueue<Integer> Q = new PriorityQueue<>();
		int a;
		for(int i = 0; i < 10; i++){
			a = in.nextInt();
			Q.add(a);
			System.out.print(Q.peek()+" ");// 輸出當前隊列的最小元素
		}
	}

輸入: 1 -1 -2 -3 10 -4 -5 -6 -7 -8
輸出: 1 -1 -2 -3 -3 -4 -5 -6 -7 -8

有興趣深入了解一下:https://www.cnblogs.com/CherishFX/p/4643940.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM