Java 基於堆的最大最小優先佇列

2021-09-24 16:00:32 字數 2790 閱讀 4672

解釋:在程式中需要有序的處理一批程式,但一定要求它們全部有序,或者是不一定要一次就將它們排序; 很多情況都是收集一些元素,然後處理最大/最小元素,也就是應該支援刪除最大/最小元素和插入元素的一種資料結構。

定義:優先佇列是一種抽象資料型別(能對使用者隱藏資料型別),它表示了一組值和對這些值的操作,它的抽象層能使我們方便的將我們的應用程式和我們的具體實現分離開來

堆可以理解為是一種陣列的表示方法,在二叉堆表示的陣列中,每個元素都要保證大於等於/小於等於另外兩個特定元素,相應的這些位置的元素又至少要大於等於/小於等於陣列中的另外兩個特定位置的元素,以此類推,如果我們將每個較大/較小的元素和兩個較小/較大的元素用邊連線起來我們就可以畫出一顆二叉樹的結構(注意:堆陣列從1開始)

小頂堆:每個節點都大於等於它的父節點 即 key[i] <= key[2i] && key[i]<=key[2i+1]

大頂堆:每個節點都小於等於它的父節點 即key[i] >= key[2i] && key[i] >=key[2i+1]

二叉堆表示法:在陣列中我們只要將二叉樹的節點按照層級順序放入陣列中,根節點在1,它的子節點在2,3,而子節點的子節點在4,5,6,7,以此類推

定義:二叉堆是一組能夠用堆有序的完全二叉排序的元素,並在陣列中按照層級排序

首先我們要實現堆的有序化,但在這個過程中會遇到兩個情況

由下至上的堆有序化(上浮 最大優先佇列)

這種狀態打破的原因是某個節點變得比它的父節點更大(最小優先隊列為更小),那麼我們就需要通過交換它和它父節點的位置來修復;交換後它比它的兩個子節點都大(乙個是曾經的父節點,另乙個比它更小,因為它是父節點的子節點),也可能交換後還是比它現在的父節點大,所以我們可以迴圈呼叫此操作,不斷向上移動該結點,直到遇到更大的父節點

private void swim(int k) 

}

由上至下的堆有序化(下沉 最大優先佇列)

這種是因為某個節點變得比它的兩個子節點更小或是其中之一被打破了,所以我們通過將它和它的兩個子節點種的較大者交換來交換順序(最小優先隊列為較小者);同樣,交換後可能還是會子節點處繼續打破堆有序,所以也需要迴圈呼叫此操作,直到遇到兩個子節點都比它小或是達到了堆底

private void sink(int k) 

}

最大優先佇列

public class maxpq> 

public boolean isempty()

public int size()

public void insert(key v)

private void swim(int k)

} private void sink(int k)

} public key delmax()

private boolean less(int i,int j)

private static void exch(comparable v, int i, int j)

public static void show(comparable a)

system.out.println();

} public static void main(string args)

}

輸出

25 10 23 6 3 9 

刪除最大節點:

23 10 9 6 3 null

最小優先佇列

public class minpq> 

public minpq()

public void insert(key key)

n++;

pq[n] = key;

swim(n);

} /**

* @param i

*/private void resize(int i)

pq = temp;

} public key delmin()

private void swim(int i)

} private void exch(int i, int j)

/*** @param i

*/private void skin(int i)

if (greater(k, i))

exch(pq, i, k);

i = k;

} }private boolean greater(int i, int k)

/*** @param k

* @param i

*/private static void exch(comparable v, int k, int i)

public static void show(comparable a)

system.out.println();

} public int size()

public boolean isempty()

return false;

} public static void main(string args)

}

輸出

3 6 9 25 10 23 

刪除最小節點:

6 10 9 25 23 null

堆(優先佇列,即最大堆,最小堆)

優先佇列 priority queue 特殊的 佇列 取出元素的順序是 依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。堆的兩個特性 結構性 用陣列表示的完全二叉樹 有序性 任一結點的關鍵字是其子樹所有結點的最大值 或最小值 最大堆 maxheap 也稱 大頂堆 最大值 最小堆 min...

基於堆的優先佇列

源 如下 include include typedef struct item node struct item static item pq static int n void swap item a,item b 自底向上堆化 完全二叉樹 父節點的關鍵值大於等於子節點關鍵值 void fixu...

基於大頂堆實現的最大優先順序佇列

最大優先順序佇列有著以下操作 1.返回最大值 heap maximum 2.去掉最大值並返回 heap extract max 3.將i的關鍵值增加到key heap increase key 4.向優先佇列中插入乙個結點 max heap insert 演算法 及測試 如下 include inc...