雙堆維護中位數

2021-08-15 01:25:55 字數 539 閱讀 7757

1,先把第乙個數賦給mid

2,後來的數如果》=mid就插入到小頂堆<=mid就插入到大頂堆

3,每次插入新的值後都保證小頂堆的大小與大頂堆相等或大1

4,最後的中位數就是mid(n為奇數),或者mid和小頂堆的堆頂元素的平均

priority_queue,greater >smallseq;

priority_queue,less >bigseq;

int mid;

int a[100000];

void fun(int n)

elseelse

if(bigseq.size()==smallseq.size()+1)}}

if(smallseq.size()==bigseq.size())

midian=mid;

else

midian=(mid+smallseq.top())/2.0;

printf("%g\n",midian);

}void init()

雙堆求動態中位數

acwing 106.動態中位數 這題可以用兩個堆完成,用乙個大根堆儲存中位數左邊的數,用乙個小根堆儲存中位數右邊的數。因此,我們需要維護兩個堆的乙個性質 兩個堆的數字數目需要相同 為了方便,將中位數也算在左邊的大根堆中,所以實際上大根堆會比小根堆的數目多乙個 每次讀入乙個數,判斷大根堆 down ...

Poj3784(對頂堆維護中位數)

建立乙個大根堆與小根堆,大根堆中存 n 1 2 的元素,中位數即為大根堆堆頂 用乙個從大到小排序的優先佇列q1來模擬小於x的數。從小到大排序的優先佇列q2來模擬大於x的數。動態維護兩個優先佇列的元素個數。q1.size q2.size 輸入的數為偶數個時,q1.size q2.size 1 輸入的數...

動態維護數列的中位數

問題陳述 有個需要動態更新 插入或刪除 的數列l,現在需要隨時獲取到該數列的中位數,請設計相應的資料結構和演算法。演算法 令l的中位數為m,用乙個大頂堆儲存數列l中不大於m的元素 即l按從小到大排列時的前半部分 用乙個小頂堆儲存數列l中不小於m的元素 即l按從小到大排列時的後半部分 其中這兩個大小頂...