我知道最小堆是類使用的結構,因爲它的效率很高。在我看來,當將未排序的數據提供給PQ時,會將其分類爲堆。優先級隊列中的排序與未排序數據爲什麼自動排序和排序等待?
但是當按照compareTo方法提供元素時,它會在PQ上執行第一個操作後等待將其排序到堆中。
你知道這是爲什麼嗎?我不明白爲什麼它不像無序數據那樣自動排序。
我附上了一個程序,我認爲證明了我的問題。
輸出:
未排序的數據:
[A,B,d,C,L,F,E,J]
甲
[B,C, d,J,L,F,E]
[1,2,4,3,12,6,5,10]
[2,3,4,10,12,6,5]
排序的數據:
[A,B,C,d,E,F,G ,H]
甲
[B,d,C,H,E,F,G]
[1,2,3,4,5,6,7,8]
[2,4,3,8,5,6,7]
import java.util.PriorityQueue;
public class Queue2
{
public static void main(String[] args)
{
PriorityQueue<String> pQueue = new PriorityQueue<String>();
pQueue.add("A");
pQueue.add("C");
pQueue.add("F");
pQueue.add("B");
pQueue.add("L");
pQueue.add("D");
pQueue.add("E");
pQueue.add("J");
System.out.println(pQueue);
System.out.println(pQueue.remove());
System.out.println(pQueue);
System.out.println();
PriorityQueue<Integer> pQueue2 = new PriorityQueue<Integer>();
pQueue2.add(1);
pQueue2.add(3);
pQueue2.add(6);
pQueue2.add(2);
pQueue2.add(12);
pQueue2.add(4);
pQueue2.add(5);
pQueue2.add(10);
System.out.println(pQueue2);
System.out.println(pQueue2.remove());
System.out.println(pQueue2);
System.out.println();
PriorityQueue<String> pQueue3 = new PriorityQueue<String>();
pQueue3.add("A");
pQueue3.add("B");
pQueue3.add("C");
pQueue3.add("D");
pQueue3.add("E");
pQueue3.add("F");
pQueue3.add("G");
pQueue3.add("H");
System.out.println(pQueue3);
System.out.println(pQueue3.remove());
System.out.println(pQueue3);
System.out.println();
PriorityQueue<Integer> pQueue4 = new PriorityQueue<Integer>();
pQueue4.add(1);
pQueue4.add(2);
pQueue4.add(3);
pQueue4.add(4);
pQueue4.add(5);
pQueue4.add(6);
pQueue4.add(7);
pQueue4.add(8);
System.out.println(pQueue4);
System.out.println(pQueue4.remove());
System.out.println(pQueue4);
}
}
所以我認爲你說的是有序的信息符合形狀和堆屬性,因此是一個min二進制堆,不需要改變。只有當物品被移除時纔會更改。而無序數據需要在堆被更改之前排入堆中。因此,我的問題將是一個糟糕的問題,因爲排序後的數據堆積如山。 – user2428874
@ user2428874好吧,我不認爲這是一個壞問題,但其餘的就是這樣。你打印的是底層數組,它確實代表了二進制最小堆。 –
感謝您的幫助。我覺得有點傻,但你的解釋確實有幫助。我無法提前建立連接。再次感謝! – user2428874