#include<bits/stdc++.h>
using namespace std;
#define N 1010000
#define ll long long
#define lb long double
#define P pair<int,int>
#define LL long long
template<typename T>
class Median{
public:
multiset<T> mn,mx;//双multiset实现全部数的储存,在保持两个set元素数量一样的情况下则双端元素为中位数
void equal();//使两个set容器的元素数量相等
void insert(T cur);//插入元素
void delet(T cur);//删除元素
T find();//找中位数
};
template<typename T>
void Median<T>:: equal(){
int n1=mn.size();
int n2=mx.size();
if(n2==n1) return;
if(n2+1==n1) return;
int ad=0;
if((n2+n1)%2==1) ad++;
while(n1<n2+ad){
T fr=*(mx.begin());
mx.erase(mx.begin());
mn.insert(fr);
n1++;
n2--;
}
while(n2+ad<n1){
auto it=mn.rbegin();
T bc=*(it);
auto itt=it.base();
mn.erase(--itt);
mx.insert(bc);
n2++;
n1--;
}
}
template<typename T>
void Median<T>:: insert(T cur){
equal();
if(mn.size()==0){
mn.insert(cur);
return;
}
int bc=*(mn.rbegin());
if(cur<=bc){
mn.insert(cur);
}
else{
mx.insert(cur);
}
equal();
}
template<typename T>
void Median<T>:: delet(T cur){
auto it=mn.find(cur);
if(it!=mn.end()){
mn.erase(it);
equal();
return;
}
it=mx.find(cur);
if(it!=mx.end()){
mx.erase(it);
equal();
return;
}
}
template<typename T>
T Median<T>:: find(){
equal();
int n1=mn.size();
int n2=mx.size();
if(n2==0) return *(mn.rbegin());
T fr=*(mx.begin());
T bc=*(mn.rbegin());
if(n1==n2) return (fr+bc)/2;
else{
if(n1>n2) return bc;
else return fr;
}
}
signed main(){
Median<double> mid;
double a[111]={1,5,2,4,6,7,8,3,9,10};
for(int i=0;i<=9;i++){
mid.insert(a[i]);
}
cout<<mid.find()<<endl;
mid.delet(6);
cout<<mid.find()<<endl;
mid.delet(1);
cout<<mid.find()<<endl;
mid.delet(10);
cout<<mid.find()<<endl;
}
利用multiset容器求中位数
于 2023-11-06 13:59:50 首次发布