演算法入門 優先佇列實現 堆

2021-09-24 18:40:34 字數 2116 閱讀 5267

優先佇列(priorityqueue),根據key值的大小將元素進行排序、先被pop的通常是優先順序最高的。此處介紹基於堆實現的優先佇列,binary heap是一種完全二叉樹,以大堆為例,每棵樹的根節點的key值一定大於其子孫節點的key值,完全二叉樹除了最底層的葉子節點外,其他位置都是填滿的。這樣我們可以利用陣列來儲存所有節點。

若將陣列從下標1開始儲存元素、那麼下標為 i 的節點的左孩子節點的下標為 2 * i、而右孩子節點下標為 2 * i + 1;這樣可以很容易定位乙個節點的孩子節點或父節點的在陣列中位置。

新增元素,也就是需要將元素新增到最底層葉子節點從左向右的空位置上。就是vector的最後乙個位置。

通過下標計算出新節點的父親節點、與父節點key值比較、若比父節點大、則與父節點進行位置交換、不斷上溯直到比父節點小或者父節點為空(也就是本身成為了根節點)。

在與父節點交換時、只需要交換他們的值就好。

因為是佇列、每次pop是刪除都是刪除根節點。

由於要保證heap的complete binary tree結構、每次刪除的節點實際上都是最後一塊記憶體空間(vector中最後乙個位置)。

刪除根節點時需要比較左右節點的key值、與刪除節點進行交換,然後以刪除節點位置開始向下查詢(重複)。

用堆實現優先佇列

堆的性質 1.乙個是他是乙個陣列 當然你也可以真的用鍊錶來做。2.他可以看做乙個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nsize 2個。3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i 2,他的左孩子結點就是i 2,右孩子結點就是i 2 1,如果下標從0開始,要...

用堆實現優先佇列

話不多說,先上 include include 定義乙個堆得結構體,struct myheap 調整資料,維持堆得性質,這個和上次heapify的作用一樣 只是這個時從子道父節點這樣的判斷而已。int increasekey myheap pheap,int npos else 否則堆沒有被破壞,退...

優先佇列《堆》

1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...