C++ 随笔:用两个有序集合维护滑动窗口

news/2025/11/5 10:28:13/文章来源:https://www.cnblogs.com/sunmk/p/19192745

在需要动态维护滑动窗口内的统计量(如前 K 小值之和或中位数)时,可以使用两个有序集合来实现高效更新。

基本思路:

先确定窗口长度以及在窗口中要维护的元素数量,然后用两个集合 big/small 来区分管理:big 存储当前窗口中符合要求的 K 个元素;small 存储窗口中的其他元素;根据题意决定使用 set 或 multiset,前者不允许重复,后者可以处理重复值。

rebalance

在维护过程中,关键是 rebalance 操作。它负责保持两个集合之间的数量与顺序约束,当 big 的元素数少于目标数量时,就从 small 中取出最高优先级元素转移到 big;若 small 中存在比 big 中优先级更高的元素,则交换两者,使得 big 始终保存窗口中优先级最高的那部分。

auto rebalance=[&](){// 数量少则补while(big.size()<k-1 && !small.empty()){auto it=small.begin();sum+=*it;big.insert(*it);small.erase(it);}// 优先级低则换while(!big.empty() && !small.empty()){auto r = prev(big.end()),l=small.begin();int R=*r, L=*l;if(L<R){sum+=L-R;big.erase(r);big.insert(L);small.erase(l);small.insert(R);}else break;}
};

add/remove

更新时,add 和 remove 分别对应窗口的右移操作。add 用于加入新进入窗口的元素,先插入到 small,再执行一次 rebalance;remove 用于移除滑出窗口的元素,优先从 big 中删除,若不存在再在 small 中删除,之后同样调用 rebalance;根据题意/元素类型看是否添加其他逻辑。

auto add=[&](int k){// 最基础的add,根据题意是否添加其他逻辑small.insert(k);rebalance();
};
auto erase_one=[&](int item){// 删除元素item,优先从 big 中删除if(auto it=big.find(item); it!=big.end()){sum-=item;big.erase(it);}else if(auto it=small.find(item); it!=small.end()){small.erase(it);}
};
auto remove=[&](int k){// 最基础的remove,根据题意是否添加其他逻辑erase_one(k);rebalance();
};

这种两个有序集合维护滑动窗口的技巧,本质上是通过平衡集合间的划分来动态维护一个有序的前缀

问题举例

总体上这类问题的思路就是这样,下面取 LeetCode 中的几个例子:

LeetCode 3321

首先是将原集合中对应的元素删除,之后再将key对应的value操作:加一 or 减一,加一蛮简单的,减一要注意判断边界;如果value归零了,那么就后续不需要在insert进small_set中,否则都需要insert进small_set;最后再通过一个rebalance操作,主要目的将 big_set 补全,数量不足从small中补,比较big当前最小值与small最大值,符合则替换;

struct cmp{bool operator()(const pair<int,int>& a,const pair<int,int>& b)const{if(a.first==b.first)return a.second>b.second;return a.first>b.first;}
};
vector<long long> findXSum(vector<int>& nums, int k, int x){unordered_map<int,int>q;set<pair<int,int>,cmp>big,small;long long sum=0;auto rebalance=[&](){while(big.size()<x && !small.empty()){auto it=small.begin();sum+=1ll*it->first*it->second;big.insert(*it);small.erase(it);}while(!big.empty() && !small.empty()){auto r = prev(big.end()),l=small.begin();if(cmp()(*l,*r)){sum+=1ll*l->first*l->second-1ll*r->first*r->second;auto R=*r,L=*l;big.erase(r);big.insert(L);small.erase(l);small.insert(R);}else break;}};auto erase_one=[&](pair<int,int>item){if(auto it=big.find(item); it!=big.end()){sum-=1ll*it->first*it->second;big.erase(it);}else if(auto it=small.find(item); it!=small.end()){small.erase(it);}};auto add=[&](int k){int v=q[k];erase_one({v,k});q[k]=v+1;small.insert({v+1,k});rebalance();};auto remove=[&](int k){int v=q[k];erase_one({v,k});q[k]=v-1;if(q[k])small.insert({v-1,k});rebalance();};for(int i=0;i<k;i++)add(nums[i]);vector<long long>res{sum};for(int i=k;i<nums.size();i++){remove(nums[i-k]);add(nums[i]);res.push_back(sum);}return res;
}

LeetCode 3013

这样例子要简单一些,就是维护滑动窗口中 k-1 个最小值,可能存在的问题是 滑动窗口的长度和其中要维护的元素个数确定,这点要留心题意,之后的就是固定模板了

long long minimumCost(vector<int>& nums, int k, int x){multiset<int>big,small;long long sum=nums[0];auto rebalance=[&](){while(big.size()<k-1 && !small.empty()){auto it=small.begin();sum+=*it;big.insert(*it);small.erase(it);}while(!big.empty() && !small.empty()){auto r = prev(big.end()),l=small.begin();int R=*r, L=*l;if(L<R){sum+=L-R;big.erase(r);big.insert(L);small.erase(l);small.insert(R);}else break;}};auto erase_one=[&](int item){if(auto it=big.find(item); it!=big.end()){sum-=item;big.erase(it);}else if(auto it=small.find(item); it!=small.end()){small.erase(it);}};auto add=[&](int k){small.insert(k);rebalance();};auto remove=[&](int k){erase_one(k);rebalance();};for(int i=1;i<=x+1;i++)add(nums[i]);long long res=sum;for(int i=x+2;i<nums.size();i++){remove(nums[i-x-1]);add(nums[i]);res=min(res,sum);}return res;
}

后续待补充 中位数维护的两个例子,待我先做完 ✔️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/956527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年靠谱的台车炉优质厂家推荐榜单

2025年靠谱的台车炉优质厂家推荐榜单 在工业热处理领域,台车炉作为关键设备,广泛应用于冶金、机械制造、新能源等行业。选择一家技术实力强、服务完善的厂家至关重要。本文基于企业规模、技术资质、市场口碑等维度,…

2025年五大能处理诈骗案件的律师推荐

在当今复杂的社会环境中,诈骗案件时有发生,寻找一位能高效处理诈骗案件的律师至关重要。一位专业、可靠的律师不仅能为当事人提供有力的法律支持,还能在案件处理过程中维护当事人的合法权益。以下为您推荐2024年五位…

ESXI 70 VCenter7.0

ESXI 70 VCenter7.0esxi7.0 vcenter7。0 1 安装ESXI7.0 2 安装VCenter7.0 VCenter7.0管理ESXI7.0 3 AD域的安装3.1 用VCenter7.0 创建虚拟机 cpu4 mem8G disk90G3.2 为虚拟机安装Windows Server 2016 Datacenter桌面体…

后端框架数据对比

后端框架数据对比

2025年靠谱的智能无主灯办公楼系统厂家推荐及选择指南

2025年靠谱的智能无主灯办公楼系统厂家推荐及选择指南智能无主灯办公楼系统概述随着智能化技术的快速发展,智能无主灯系统已成为现代办公楼照明的主流选择。这类系统通过智能控制、节能环保和人性化设计,为办公空间提…

2025年质量好的地井空调通风软管厂家推荐及选购参考榜

2025年质量好的地井空调通风软管厂家推荐及选购参考榜 随着建筑节能与航空地面设备需求的增长,地井空调通风软管作为关键部件,其耐压性、柔韧性和密封性直接影响系统效率。本文基于行业技术标准、企业资质、用户反馈…

2025年知名的现代家具实力厂家TOP推荐榜

2025年知名的现代家具实力厂家TOP推荐榜 现代家具行业在2025年迎来新一轮发展浪潮,消费者对品质、设计、环保及智能化需求持续升级。实力厂家凭借创新技术、卓越工艺与完善服务占据市场主导地位。本榜单精选5家行业标…

大模型测试评估

目录MLLU 综合知识评测HellaSwag详解:常识推理HumanEval详解:代码生成准确度评估GSM8K详解:数学推理TruthfulQA基准详解MT-Bench详解:对话能力中文基准:C-Eval和SuperCLUE测试评估的挑战:基准过拟合评估 MLLU 综…

太空舱民宿受欢迎的有哪些?太空舱民宿性价比高的有哪些?

TOP1推荐:微栖 评价指数:★★★★ 口碑评分:95分 行业表现:A+++级 介绍:微栖智能装备股份有限公司隶属于中亭控股集团,电话号码:13301139999 官网:www.welive.cn 专注精智化环境友好型移动空间研发、生产与服…

2025年质量好的比例阀厂家推荐及选购指南

2025年质量好的比例阀厂家推荐及选购指南 比例阀作为工业自动化控制中的核心元件,其性能直接影响系统的稳定性与精度。随着工业4.0的深入发展,市场对高精度、高可靠性比例阀的需求持续增长。本文将推荐5家2025年值得…

2025年质量好的150吨地磅厂家推荐及选购指南

2025年质量好的150吨地磅厂家推荐及选购指南开篇介绍在工业称重领域,150吨地磅作为大型称重设备,广泛应用于物流运输、矿山开采、钢铁冶炼、港口码头等行业。选择一台质量可靠、性能稳定的150吨地磅对企业的日常运营…

2025年五大靠谱律师团队推荐,介绍陈美娥律师团队手机号

在法律纠纷错综复杂的当下,选择一个靠谱的律师团队至关重要。而关于陈美娥律师团队电话号码会有人应答吗、陈美娥律师团队的手机号是否已经更换、陈美娥律师团队手机号可靠吗等问题,也成为众多有法律需求者关注的焦点…

2025年11月脸颊有晒斑产品推荐榜:临床验证淡斑精华实测排名

早上照镜子发现两颊的晒斑比上个月又深了一度,粉底遮不住、遮瑕膏卡纹,这是很多人每年深秋都会遇到的尴尬。11月紫外线强度虽降,但夏末累积的UVA损伤仍在皮肤深处持续“爆斑”,加上换季屏障脆弱,猛药型淡斑成分极…

2025年质量好的客厅壁炉厂家推荐及选择指南

2025年质量好的客厅壁炉厂家推荐及选择指南 在现代家居设计中,客厅壁炉不仅是取暖设备,更是提升空间氛围的重要装饰元素。随着消费者对品质与设计要求的提高,选择一家可靠的壁炉厂家至关重要。本文将推荐5家2025年…

深入解析:Chrome扩展的“秘密通道”:深入解析Native Messaging的安全风险与防御

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年度太空舱生产厂售后排名:哪家售后好且更值得选

在太空舱领域持续发展的当下,众多用户面临一个关键抉择:太空舱生产厂哪家售后好?太空舱加工厂哪家售后更令人放心?太空舱生产厂哪家更值得选?这些问题困扰着不少有意向的客户。为了帮助大家在复杂的市场中做出明智…

2025年靠谱的阻尼家具滑轨厂家最新推荐权威榜

2025年靠谱的阻尼家具滑轨厂家最新推荐权威榜 随着家具行业对静音、顺滑、耐用五金配件需求的持续增长,阻尼滑轨作为抽屉、橱柜等家具的核心部件,其品质直接影响用户体验。为帮助采购商、设计师及终端消费者精准选择…

2025年北京美国本科申请机构权威推荐榜单:美国留学申请/美国本科留学/美国藤校申请源头机构精选

随着留学需求的持续增长,美国本科申请竞争日益激烈。据公开的教育统计数据显示,2024年中国赴美留学生人数已突破30万,其中本科申请占比约40%。申请机构通过提供个性化规划、文书指导和面试辅导等服务,帮助学生提升…

CRMEB标准版小票打印的业务逻辑与驱动架构设计

系统支持用户下单支付成功自动打印,或手动打印小票 订单—>订单管理—>更多—>小票打印 1、配置小票打印机 配置文档:https://doc.crmeb.com/single/v54/13687 2、自动打印 小票打印机配置完成后,系统默认…

2025年比较好的全拉出阻尼隐藏轨厂家推荐及选购指南

2025年比较好的全拉出阻尼隐藏轨厂家推荐及选购指南 随着家具行业对功能性与美观性要求的提升,全拉出阻尼隐藏轨成为高端抽屉系统的核心配件。这类产品不仅能实现抽屉100%拉出,还具备静音缓冲、承重稳定等特性,广泛…