優先佇列 二叉堆

2021-08-13 17:00:44 字數 1845 閱讀 3653

優先佇列---二叉堆:

二叉堆是一棵完全二叉樹,最大堆(最小堆)中,所有根節點的鍵值都要比對應的子樹要大(小)。

由於是完全二叉樹,所以儲存結構可以採用陣列。

最大堆的建立:

#include#include#include#include#include#include#define inf 0x3f3f3f3f

typedef int elementtype;

using namespace std;

struct heapnode ;

typedef struct heapnode *maxheap;

maxheap create(int maxsize)

最大堆的插入:

思想:先把待查元素放在陣列的最後乙個位置,然後和它的父親去比較大小,如果比他父親節點值大,則和它父親互換,然後再依次和父親節點比較大小,直到比父親節點值小為止。為了減少互換的操作,可以先去找到最後待查元素的位置再去放(這樣就有乙個空穴)。---這一策略叫做上濾(空穴往上走)

陣列0處放哨兵,卡住邊界。

void insert(maxheap h, elementtype item)

int i = ++h->size;

for (; h->elements[i / 2] < item; i /= 2)//0處有哨兵。

h->elements[i] = h->elements[i / 2];//上面的往下面走。直到i的父節點中的值大於item。

h->elements[i] = item;//放

}

最大堆的刪除:

思想:把根節點元素返回。陣列最後乙個元素(tmp)先放在根節點位置(1位置),然後再去調整堆的順序性,類似於插入,根節點元素值和兒子節點最大值相比較,如果前者比後者小,就互換,依次互換下去,直到tmp大於兩個兒子節點的大小位置。

為了減少互換的操作,同樣可以先找到tmp最後放的位置,由於這次空穴往下走,所以該策略叫做下濾。

elementtype deletemax(maxheap h)

maxitem = h->elements[1];//最大值,便於後面返回。

tem = h->elements[h->size--];

for (parent = 1; parent * 2 <= h->size; parent = child)

h->elements[parent] = tem;//放

return maxitem;

}

最大堆的建立:

方法1:通過插入操作,依次將n個元素插入乙個初始化為空的堆中。時間複雜度為o(nlogn)。

方法2:先將n個元素按輸入順序存入陣列,然後調整各個節點的位置,以滿足最大堆的有序性。

調整辦法:從倒數第乙個有兒子的節點開始依次調整,這樣就能保證下面的堆序。類似於刪除的操作,每次將要調整的子堆根節點拿出來,然後下濾,找到根節點的位置,放入即可。

這種方法的時間複雜度為是n。

void percdown(maxheap h ,int p )

h->elements[parent] = x;

}void buildheap(maxheap h )

二叉堆 優先佇列

堆 堆常見的二叉堆,這種資料結構有大根堆和小根堆。對於大根堆來說,每個父節點是大於他的兩個孩子節點的。也就是最大值在根節點。小根堆與之相反。如果堆用陣列實現的話,如果從1開始計數 因為0的位置可以在上慮或者下慮的時候做個暫存的位置 那麼乙個孩子的父節點是i 2 如果知道了父節點,而左孩子的節點位置為...

二叉堆(優先佇列)

0.1 本文總結於 資料結構與演算法分析,但源 均為原創 旨在理清二叉堆 優先佇列 堆的其他操作及其應用,以便讓朋友些知道為什麼要學習優先佇列 二叉堆 1.0 優先佇列定義 優先佇列是允許至少下列兩種操作的資料結構,insert 插入 它的工作時顯而易見的,以及 deletemin 刪除最小者 它的...

優先佇列和二叉堆

優先佇列 我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於 先進 某種定義賦予它們不同的優先順序,優先順序更高的先出列。本文涉及的優先佇列優先順序定義是 數值越小,優先順序越高。也就是說,每次取出的元素都是當前...