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按從小到大排列時的後半部分 其中這兩個大小頂...