中位数( 优先队列较优处理 )

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 }
View Code

 

以上是关于中位数( 优先队列较优处理 )的主要内容,如果未能解决你的问题,请参考以下文章

中位数 (优先队列)

java 优先级队列示例(查找中位数)2017-06-19

POJ3784 动态中位数(大根堆+小根堆+优先队列)

P1168 中位数[堆 优先队列]

# Java 常用代码片段

# Java 常用代码片段