堆是一種類似二叉樹的結構,分為小根堆和大根堆,小根堆是父節點的值比子節點小,大根堆是父節點的值比子節點大。堆是用陣列來實現的,0為根節點,每個結點的子節點下標為2*i+1和2*i+2;如果要保證堆的結構,需要
上浮 shift_up;下沉 shift_down
來維護,時間複雜度為log
有這樣一道題
動態求中位數
求中位數就可以開這樣兩個堆,大的一半存入小根堆,小的一半存入大根堆,這裡我們把小根堆堆頂(父節點)作為中位數(也可以用大根堆堆頂),如果我們用優先佇列來代替陣列的話,在這裡就不需要維護了(畢竟我們只需要堆頂),插入時對比插入到**然後選擇哪個做中位數就可以了
#include#define maxn 10005
using namespace std;
priority_queue,greater>q1;//小根堆,堆頂中位數
priority_queue,less>q2;//、大根堆
int t,n,x,cnt,tot,ans[maxn];
void add(int x)
if(x>q1.top()) q1.push(x);
else q2.push(x);
while(q1.size()q2.size()+1)
}int main()
for(int i=0;i0 && i%10==0) puts("");
if(i%10) putchar(' ');
printf("%d",ans[i]);
}puts("");
}return 0;
}
雙堆求動態中位數
acwing 106.動態中位數 這題可以用兩個堆完成,用乙個大根堆儲存中位數左邊的數,用乙個小根堆儲存中位數右邊的數。因此,我們需要維護兩個堆的乙個性質 兩個堆的數字數目需要相同 為了方便,將中位數也算在左邊的大根堆中,所以實際上大根堆會比小根堆的數目多乙個 每次讀入乙個數,判斷大根堆 down ...
中位數 (優先佇列)
這種題型比較常見,所以總結下來為妙。一般暴力的方法是找到排乙個序,然後輸出中間點。然後正解的方法是優先佇列。乙個大根堆乙個小根堆,用於儲存中位數左邊的數和中位數右邊的數。然後每一次插入某個數的時候,可以插入到中間,然後判斷左右兩個堆的大小,保持均等即可。include include include...
演算法 堆 求整型中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 vo...