中位数( 优先队列较优处理 )
Posted sj-gank
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中位数( 优先队列较优处理 )相关的知识,希望对你有一定的参考价值。
首先 ,不妨假设 mid 为最初的中位数,开一个小根堆存储 q1(<=mid )一个大根堆存储 q2( >mid )当向堆中加入元素通过与 mid 比较
1 scanf("%d",&a[i]); 2 if(a[i]>mid) q2.push(a[i]); 3 else q1.push(a[i]);
当两堆中元素个数不等的时候 就要维护 mid 肯定是多的元素堆移向少的元素堆
1 if(q1.size()>q2.size()){ 2 while(q1.size()!=q2.size()){ 3 q2.push(mid); 4 mid=q1.top();q1.pop(); 5 } 6 } 7 else if(q1.size()<q2.size()){ 8 while(q1.size()!=q2.size()){ 9 q1.push(mid); 10 mid=q2.top();q2.pop(); 11 } 12 }
一道简单例题::https://www.luogu.org/problem/P1168
1 #include<bits/stdc++.h> 2 #define ull unsigned long long 3 #define ll long long 4 const int MOD=1e9+7; 5 const int maxn=1e5+5; 6 using namespace std; 7 8 int a[maxn]; 9 priority_queue<int,vector<int>,less<int> >q1; 10 priority_queue<int,vector<int>,greater<int> >q2; 11 12 int main() 13 { 14 int n; 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++) 17 { 18 scanf("%d",&a[i]); 19 } 20 int mid=a[1]; 21 printf("%d ",mid); 22 for(int i=3;i<=n;i+=2) 23 { 24 if(a[i-1]<=mid){ 25 q1.push(a[i-1]); 26 } 27 else{ 28 q2.push(a[i-1]); 29 } 30 if(a[i]>mid){ 31 q2.push(a[i]); 32 } 33 else{ 34 q1.push(a[i]); 35 } 36 if(q1.size()>q2.size()){ 37 while(q1.size()!=q2.size()){ 38 q2.push(mid); 39 mid=q1.top();q1.pop(); 40 } 41 } 42 else if(q1.size()<q2.size()){ 43 while(q1.size()!=q2.size()){ 44 q1.push(mid); 45 mid=q2.top();q2.pop(); 46 } 47 } 48 printf("%d ",mid); 49 } 50 return 0; 51 }
以上是关于中位数( 优先队列较优处理 )的主要内容,如果未能解决你的问题,请参考以下文章