資料結構 堆(優先佇列)

2021-07-16 05:46:50 字數 989 閱讀 4938

一種樹形資料結構,分大根堆小根堆

大根堆(max heap)滿足所有父節點不小於其任意子節點。

小根堆(min heap)滿足所有父節點不大於其任意子節點。

在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹

solution

可見,每堆果子分別被合併了n-1次,n-2次,n-3次……1次

則數量越小的堆合併次數應越多。

建立乙個小根堆,每次合併堆頂與其小兒子計入總數,相當於修改小兒子(ο(logn)),堆頂刪除(ο(logn))。

複雜度(ο(nlogn))

起先黑匣子為空。現在執行一系列命令,命令有兩類:

add(x):把元素x放入黑匣子;

get:輸出黑匣子內第k大的數,其中k為當前執行get操作的總次數。

命令條數不超過500000。

solution

先考慮尋找第k大數,即尋找數列中第k大的數。

因為要輸出第k大的數,故維護乙個size是k的小根堆,堆頂即當前第k小的數。輸入的數與堆頂元素比較,若比其大則堆頂變成當前第k+1大的數,故替換堆頂。

故此題利用兩個堆,乙個小根堆,乙個大根堆,小根堆儲存所有前k大的值,大根堆儲存所有其它的值,即小根堆中的值嚴格大於等於大根堆中的值,大根堆堆頂為k+1大的數。每次輸入元素放入大根堆中。k增加,則將原大根堆的根元素放入小根堆中。

solution

先考慮k路歸併問題

因為k個表都是有序的,故每個表第乙個資料最小(以最小為例)。故比較每個表第乙個資料,並輸出最小值。可把每個表第乙個資料建堆維護,輸出最小後再在該值所在表中調取下個元素。

故此題可以把這些和看成n個有序表:

solution

兩兩合併即可。

資料結構 優先佇列(堆)

什麼是堆 堆是一棵具有特定性質的二叉樹 堆的基本要求是堆中所有節點的值必須大於等於 或者小於等於 其孩子節點的值 堆應該是一棵完全二叉樹 堆的表示 由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間 public class heap private int ary private int ...

資料結構 優先佇列(堆)

堆 堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 結構性質 堆總是一棵完全樹。堆序性 堆中某個節點的值總是不大於或不小於其父節點的值 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。堆的意義就在於 最快的找到最大 最小值,在堆結構中插入乙個值重新構造堆結構,取走最...

資料結構 堆 優先佇列

堆,實際上是乙個完全二叉樹,大概就是介個樣子。堆一般又分為大頂堆和小頂堆 實際上差不多。這裡就用小頂堆舉個例好了qwq 其實stl中的優先佇列已經有堆的作用了,但是手寫的堆也有一些自己的優勢。我們先來看看堆的一些常用操作。1.插入乙個數 2.求集合當中的最小值 3.刪除最小值 4.刪除任意乙個元素 ...