優先佇列---二叉堆:
二叉堆是一棵完全二叉樹,最大堆(最小堆)中,所有根節點的鍵值都要比對應的子樹要大(小)。
由於是完全二叉樹,所以儲存結構可以採用陣列。
最大堆的建立:
#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 刪除最小者 它的...
優先佇列和二叉堆
優先佇列 我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於 先進 某種定義賦予它們不同的優先順序,優先順序更高的先出列。本文涉及的優先佇列優先順序定義是 數值越小,優先順序越高。也就是說,每次取出的元素都是當前...