堆的應用:優先佇列。
什麼是優先佇列?
優先佇列是一種從來維護一組由元素構成的集合s的資料結構,其中每乙個元素都乙個值,被稱為關鍵字。
優先佇列可以用堆來實現。
優先佇列可以分為最大優先佇列、最小優先佇列。
最大優先佇列支援的操作有:1. insert; 2. maximum; 3. extract_max; 4. incease_key;
(由最大堆實現).
由於使用堆實現優先佇列,這裡先給出堆的操作
void max_heapify( vector& a, int i)
}void build_max_heap( vector& a)
void heap_sort( vector& a)
}
maximum( s): 返回s中的最大關鍵字元素。
**:
vectora = ; //a[0]作為哨兵
int heap_size = a.size() - 1; //因為多了乙個 a[0], 所以要減去1.
//用來實現 maximun 操作。
int heap_maximun( vector& a)
上述操作的執行時間為:o(1
)o(1)
o(1)
.extract_max(s): 去掉並返回 s 中的最大元素。
操作過程:首先用maximun記錄最大元素,之後將 a[1] 與 a[heap_size] 交換,heap_size–(標記刪除 a[1]), 最後對 a[1] 使用 max_heapify, 用來維護最大堆性質。
**:
int heap_maximun( vector& a)
int heap_extract_max( vector& a)
上述操作的執行時間為:o(l
ogn)
o(logn)
o(logn
).increase_key(s, x, k): 將 s 中元素 x 的關鍵字提公升到 k. 這裡 k 不小於 x.
操作:由於增大關鍵字,可能會違背最大堆的性質,當違背最大堆性質時,應該在當前節點到根節點的路徑上尋找合適的插入位置。
**:
void heap_increase_key( vector& a, int i, int key)
}
上述操作的時間複雜度為:o(l
ogn)
o(logn)
o(logn
).insert(s, x): 把關鍵字 x 插入到 s 中, 相當於 s=s
∪xs = s \cup
s=s∪x.
步驟:首先向最大堆 a 中插入乙個關鍵字為 −
∞-\infin
−∞的葉節點來擴大最大堆,然後利用 incease_key 將改葉節點設定關鍵字,同時也保持了最大堆的性質。
**:
void heap_insert( vector& a, int x)
改操作的時間複雜度為o(l
最大優先佇列 演算法導論
堆排序是乙個優秀的演算法,但是在實際應用中,如快速排序的效能會優於它。但是堆排序有著另外的作用,如優先佇列 與堆排序一樣,優先佇列也有兩種形式 最大優先佇列,最小優先佇列 暫且討論最大優先佇列 優先佇列 是一種用來維護由一組元素構成的集合s的資料結果,其中的每個元素都有乙個相關的值,稱為關鍵字。最大...
演算法導論 堆排序 優先佇列
二叉堆是乙個陣列,可以被看做乙個近似的完全二叉樹。性質 建堆 可以使用自底向上的方法利用過程maxheapify 向下調整堆 把陣列a 1 n 轉換為堆。偽 向下調整堆maxheapify 偽 演算法描述 3.向上調整堆 向上調整堆 private void adjustup int a,int i...
演算法導論 優先佇列(基於堆排序)
include includeusing namespace std define length 10 void maxheapify int num,int i,int len 堆調整 void buildheap int num,int len 建立初始最大隊 int heapsort int ...