演算法 基於堆的優先佇列

2022-07-04 15:15:22 字數 1203 閱讀 3880

1.具體演算法

public class maxpqimplements iterable

/** * 返回佇列是否為空

*/public boolean isempty()

/*** 返回優先佇列中的元素個數

*/public int size()

/*** 返回最大元素

*/public key max()

/** * 向優先佇列中插入乙個元素

*/public void insert(key x)

/*** 刪除並返回最大元素

*/public key delmax()

private void swim(int k)

}private void sink(int k) }}

2.演算法分析優先佇列由乙個基於堆的完全二叉樹表示,儲存於陣列pq[1...n]中,pq[0]沒有使用。在insert()中,我們將n加一併把新元素新增在陣列最後,然後用swim()恢復堆的秩序。在delmax()中,我們從pq[1]中得到需要返回的元素,然後將pq[n]移動到pq[1],將n減一並用sink()恢復堆的秩序。同時我們還將不再使用的pq[n+1]設為null,以便系統**它所占用的空間。

命題:對於乙個含有n個元素的基於堆的優先佇列,插入元素操作只需不超過(lgn+1)次比較,刪除最大元素的操作需要不超過2lgn次比較。

證明:由上乙個命題可知,兩種操作都需要在根結點和堆底之間移動元素,而路徑的長度不超過lgn。對於路徑上的每個結點,刪除最大元素需要兩次比較(除了堆底元素),一次用來找出較大的子結點,一次用來確定該子結點是否需要上浮。

對於需要大量混雜的插入和刪除最大元素操作的典型應用來說,上面的命題意味著乙個重要的效能突破。使用有序或是無序陣列的優先佇列的初級實現總是需要線性時間來完成其中一種操作,但基於堆的實現則能夠保證在對數時間內完成它們。這種差別使得我們能夠解決以前無法解決的問題。

堆上的優先佇列操作如下圖

基於堆的優先佇列

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

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

解釋 在程式中需要有序的處理一批程式,但一定要求它們全部有序,或者是不一定要一次就將它們排序 很多情況都是收集一些元素,然後處理最大 最小元素,也就是應該支援刪除最大 最小元素和插入元素的一種資料結構。定義 優先佇列是一種抽象資料型別 能對使用者隱藏資料型別 它表示了一組值和對這些值的操作,它的抽象...

優先佇列《堆》

1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...