優先佇列和二叉堆

2021-07-27 04:28:48 字數 1291 閱讀 8152

優先佇列

我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於「先進」,某種定義賦予它們不同的優先順序,優先順序更高的先出列

本文涉及的優先佇列優先順序定義是:數值越小,優先順序越高。也就是說,每次取出的元素都是當前佇列中數值最小的。例如:

–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...