雙堆求動態中位數

2022-09-11 01:00:39 字數 813 閱讀 9174

acwing 106.動態中位數

這題可以用兩個堆完成,用乙個大根堆儲存中位數左邊的數,用乙個小根堆儲存中位數右邊的數。

因此,我們需要維護兩個堆的乙個性質:

兩個堆的數字數目需要相同(為了方便,將中位數也算在左邊的大根堆中,所以實際上大根堆會比小根堆的數目多乙個)。

①每次讀入乙個數,判斷大根堆$down$是否為空,若空, 就插入。或者當前的數$x$是否小於大根堆$down$的堆頂,是就插入,否則就插入小根堆$up$。

②然後判斷大根堆$down$的數目是不是比小根堆$up$的數目$+1$還要大,如果還要大,就需要將大根堆$down$的堆頂元素放入小根堆$up$中。

③然後判斷小根堆$up$的數目是不是比大根堆$down$的數目大,是就將小根堆$up$的堆頂元素插入大根堆$down$中。

然後在總數目為奇數的時候,大根堆$down$的堆頂元素就是當前序列的中位數。

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;78

910intmain()

4041}42

if(cnt % 10)cout <

44return0;

45 }

動態求中位數 堆 優先佇列

堆是一種類似二叉樹的結構,分為小根堆和大根堆,小根堆是父節點的值比子節點小,大根堆是父節點的值比子節點大。堆是用陣列來實現的,0為根節點,每個結點的子節點下標為2 i 1和2 i 2 如果要保證堆的結構,需要 上浮 shift up 下沉 shift down 來維護,時間複雜度為log 有這樣一道...

雙堆維護中位數

1,先把第乙個數賦給mid 2,後來的數如果 mid就插入到小頂堆 mid就插入到大頂堆 3,每次插入新的值後都保證小頂堆的大小與大頂堆相等或大1 4,最後的中位數就是mid n為奇數 或者mid和小頂堆的堆頂元素的平均 priority queue,greater smallseq priorit...

演算法 堆 求整型中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 vo...