優先佇列
我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於「先進」,某種定義賦予它們不同的優先順序,優先順序更高的先出列。
本文涉及的優先佇列優先順序定義是:數值越小,優先順序越高。也就是說,每次取出的元素都是當前佇列中數值最小的。例如:
–pop->
有多種方法實現該資料結構,有序或者無序陣列,stl模板,還有一種典型實現,便是二叉堆實現。
二叉堆二叉堆是二叉樹狀結構,它具有以下性質:
- 任意父節點的值不大於(或不小於)子節點的值。
- 是完全二叉樹或近似完全二叉樹。
滿足上述性質的二叉樹稱為二叉堆。 父節點不小於子節點稱為最大堆,反之稱為最小堆。本文涉及的是最小堆。
分析首先是插入數值,插入的數值放在末尾節點,然後和父節點比較,如果比父節點小,則置換。
然後是取出最小值,取出根節點後,我們先把末尾節點的值複製到根節點上,然後刪除末尾節點,之後從根節點向下比較,發現比自己小的則互換,如果兩個兒子均筆自己小,則選取更小的進行互換。
堆的陣列實現
我們規定:
- 左兒子的編號是自己編號*2 + 1
- 右兒子的編號是自己編號*2 + 2
**部分:
#include
#define max 10000
using namespace std;
int heap[max],size;
void push(int
value) // 插入資料
heap[i] = value;
return ;
}int pop(void) // 取出最小值
heap[i] = value;
return ans;
}int main(void)
output:
4 5 8 9
4c++中stl priority_queue
注意,priority_queue取出的是最大值。
使用例子:
#include
#include //標頭檔案
using
namespace
std;
int main(void)
return
0;}
二叉堆和優先佇列
優先佇列是一種用來維護由一組元素構成的集合s的資料結構,其中的每乙個元素都有乙個相關的值,稱為關鍵字。優先佇列有最大優先佇列和最小優先佇列。優先佇列和一般的fifo佇列不一樣,從優先佇列獲取出來的值是喲優先順序的。例如,用來處理傳送給計算機部門印表機的職位 部門主管發來的職位應該首先被列印,依次是經...
優先佇列和二叉堆
優先佇列是一種常用的adt,其中的元素有序排列,入隊的元素會插入到正確的位置,隊首元素始終為最小 大 值,隊首出隊後優先佇列仍然保持原來的性質。這裡我們規定優先佇列以公升序排列。優先佇列提供的介面包括 二叉堆是優先佇列一種常用的實現,二叉堆是一種完全二叉樹,完全二叉樹除最低一層外其它層均被填滿,最低...
優先佇列 二叉堆
優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...