中位數( 優先佇列較優處理 )

2022-08-02 06:15:11 字數 1116 閱讀 6770

首先 ,不妨假設mid為最初的中位數,開乙個小根堆儲存 q1(<=mid)乙個大根堆儲存 q2( >mid)當向堆中加入元素通過與mid比較

1 scanf("

%d",&a[i]);

2if(a[i]>mid) q2.push(a[i]);

3else q1.push(a[i]);

當兩堆中元素個數不等的時候 就要維護mid肯定是多的元素堆移向少的元素堆 

1

if(q1.size()>q2.size())6}

7else

if(q1.size()

12 }

一道簡單例題::

1 #include2

#define ull unsigned long long

3#define ll long long

4const

int mod=1e9+7;5

const

int maxn=1e5+5;6

using

namespace

std;78

inta[maxn];

9 priority_queue,less >q1;

10 priority_queue,greater >q2;

1112

intmain()

1320

int mid=a[1

];21 printf("

%d\n

",mid);

22for(int i=3;i<=n;i+=2)23

27else

30if(a[i]>mid)

33else

36if(q1.size()>q2.size())41}

42else

if(q1.size()

48 printf("

%d\n

",mid);49}

50return0;

51 }

view code

中位數 (優先佇列)

這種題型比較常見,所以總結下來為妙。一般暴力的方法是找到排乙個序,然後輸出中間點。然後正解的方法是優先佇列。乙個大根堆乙個小根堆,用於儲存中位數左邊的數和中位數右邊的數。然後每一次插入某個數的時候,可以插入到中間,然後判斷左右兩個堆的大小,保持均等即可。include include include...

動態求中位數 堆 優先佇列

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

資料流的中位數(優先佇列解決)

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例 addnum 1 addnum 2 findmedian 1.5 addnum 3 findmedian 2...