PriorityQueue及二叉堆

2022-01-12 06:15:16 字數 2563 閱讀 8731

priorityqueue是乙個優先順序佇列,底層是小頂堆實現

通常的佇列是先進先出,那有一種特殊的佇列並不是先進先出,而是根據優先順序的順序出隊二叉堆是一種資料結構,堆是一種特殊的二叉樹,滿足一下條件的二叉樹1.該二叉樹必須是乙個完全二叉樹。2.子節點的值總是單調的。這裡又分為兩種情況,如果子節點總是小於等於父節點,那麼整體的樹頂元素就越大,那麼我們叫它大頂堆,反過來子節點總是大於等於父節點,那麼我們叫它小頂堆

元素是按照從上到下層級,從左到右的順序排列的樹形結構

上面我們說了二叉堆,那麼其實堆也可以是多叉堆,多叉堆同理也有上面兩個類似性質。1.完全多叉樹 2.父子節點單調性

雖說這裡的資料結構是二叉樹,但實際裝資料的容器,或者說底層還是使用的陣列,priorityqueue中原始碼:

在上圖中,我們給每個元素的下標做了標註,足夠細心的你會發現,陣列下標,存在以下關係:

leftno = parentno * 2 + 1

rightno = parentno * 2 + 2

parentno = (currentno -1) / 2

這樣一來,我們在得到任意節點的情況下,就能通過該公式找到它的父節點和子節點入堆當有了基礎的概念和理論之後,我們來構建堆,像堆中加入元素就是構建堆的乙個過程。

/**

* inserts the specified element into this priority queue.

** @return (as specified by )

* @throws classcastexception if the specified element cannot be

* compared with elements currently in this priority queue

* according to the priority queue's ordering

* @throws nullpointerexception if the specified element is null

*/public boolean add(e e)

/*** inserts the specified element into this priority queue.

** @return (as specified by )

* @throws classcastexception if the specified element cannot be

* compared with elements currently in this priority queue

* according to the priority queue's ordering

* @throws nullpointerexception if the specified element is null

*/public boolean offer(e e)

private void siftup(int k, e x)

/*** increases the capacity of the array.

** @param mincapacity the desired minimum capacity

*/private void grow(int mincapacity)

offer方法中我們可以看到的流程

合適的位置指的是 滿足 單調性 的位置

出堆

/**

* retrieves and removes the head of this queue,

* or returns if this queue is empty.

** @return the head of this queue, or if this queue is empty

*/public e poll()

}return result;

}private static void siftdowncomparable(int k, t x, object es, int n)

es[k] = key;

}private static void siftdowncomparable(int k, t x, object es, int n)

es[k] = key;

}

poll過程如

priority queue的底層實現及數組建堆。

注意 1 如果要用到小頂堆,則一般要把模板的三個引數都帶進去。stl裡面定義了乙個仿函式 greater 對於基本型別可以用這個仿函式宣告小頂堆 include include using namespace std int main getchar return 0 2 為了指定第三個模板引數,我...

C 優先佇列priority queue及過載

優先佇列中的元素不同於一般先進先出的佇列,被賦予了優先順序,優先順序佇列具有最高端先出的行為特徵,通常採用堆這種資料結構來實現。基本操作如下 priority queuepq pq.empty 隊列為空返回true,否則返回false pq.size 返回佇列中元素的個數 pq.push 在基於優先...

優先順序佇列 Priority Queue 二

在完全二叉樹周插入元素的方法是插入到底層,上濾 在完全二叉樹周刪除元素的方法是將底層元素置於頂端,下濾 為插入詞條e,只需要將e作為末尾元素接入向量 否則,e與其父節點換位 否則,e再與父節點換位 不斷重複,直到e與其父親滿足堆序性,或者e達到堆頂 沒有父親 template void pq com...