当前位置: 首页 > news >正文

动态中位数

动态中位数

假设给你一个 q q q 次查询,查询可能有插入、删除操作,完成每次操作都需要输出当前序列的中位数。

一、对顶堆维护 O ( n l o g n ) O(nlogn) O(nlogn)

维护两个 m u l t i s e t multiset multiset ,一个 p p p 存中位数及其之前的数,另一个 q q q 存中位数之后的数90。

假设目前序列长度为 n n n ,那么 p . s i z e ( ) = ( n + 1 ) / 2 p.size()=(n+1)/2 p.size()=(n+1)/2 q . s i z e = n / 2 q.size=n/2 q.size=n/2

p p p 从大到小排序, q q q 从小到大排序。

插入的时候,判断应该插到哪个容器中。

删除的时候,先判断这个数在 p p p 中是否存在,如果存在则删除,否则在 q q q 中删除。

最后每次操作完需要进行调整大小,直至 0 ≤ p . s i z e ( ) − q . s i z e ( ) ≤ 1 0 \leq p.size()-q.size() \leq 1 0p.size()q.size()1

则中位数即 p p p 的最大数。

struct MIDIUM{multiset<int>p,q;//p 从大到小 q从小到大void justify(){while(p.size()>q.size()+1){q.insert(*p.rbegin());p.erase(--p.end());}while(p.size()<q.size()){p.insert(*q.begin());q.erase(q.begin());}}void add(int x){if(!q.empty()&&x>=*q.begin())q.insert(x);else p.insert(x);        justify();}void del(int x){if(q.count(x))q.erase(q.lower_bound(x));else if(p.count(x))p.erase(p.lower_bound(x));justify();}int get_mid(){return *p.rbegin();}
};

二、树状数组求第 k k k O ( n l o g n ) O(nlogn) O(nlogn)

可以将数据离散化之后,插入到树状数组里面,然后在树状数组上二分求前缀和第一个 ≤ k \leq k k 的即可, k k k 就是中位数的位置。

struct MIDIUM{vector<int>c;int n;void init(int n){this->n=n;c=vector<int>(n+1,0);}void add(int i,int x){for(;i<=n;i+=lowbit(i)){c[i]+=x;}}int pre(int i){int ans=0;for(;i;i-=lowbit(i)){ans+=c[i];}return ans;}int get_kth(int k){int pos=0,v=0;for(int i=__lg(n);i>=0;i--){if(pos+(1<<i)<=n&&v+c[pos+(1<<i)]<k){pos+=(1<<i);v+=c[pos];}}return pos;}int get_mid(){return get_kth(pre(n)+1>>1);}
};

http://www.mrgr.cn/news/62130.html

相关文章:

  • 【牛客算法】某司面试算法题:小红的整数操作
  • 实时数据处理:技术支持和优势
  • 接口测试加密了怎么测试
  • SQL 数据汇总与透视的实用案例
  • 探索国际数据空间(IDS)架构(下)
  • 明日周刊-第25期
  • JetPack Compose安卓开发之底部导航Tabbar
  • 解决Selenium的3大痛点!这款工具让你的自动化测试效率翻倍!
  • 嵌入式linux跨平台基于mongoose的TCP C++类的源码
  • SQLark百灵连接——整合项目监控过程
  • 中酱集团:一日三餐吃出健康生活
  • 四、鸿蒙开发-常用布局(线性布局、层叠布局、弹性布局、网格布局、列表布局)
  • C语言导航 3.3指针运算符
  • QT:QThread 使用案例
  • 【Redis:原理、架构与应用】
  • JavaScript 实战技巧:让你成为前端高手的必备知识2
  • 【热管理】日本三洋 sanace 散热风扇
  • 阿里巴巴店铺商品API返回值中的商品分类与筛选条件
  • Docker:存储原理
  • 理解处理器寻址
  • “胖东来”进京赶考,永辉有救了?
  • 睿亚资产郭威:公益路上的坚定行者,照亮希望之光
  • 大数据治理:确保数据价值与合规性的战略框架
  • 【php常用公共函数】php获取指定时间段中有那几年并输出年份的起始时间和结束时间
  • 酱香经典——茅台镇的酱酒“四台”的传奇
  • 姚望篮坛数十秋 巨人肩头月满楼 新篇开启情难舍 篮球梦续望云头