求适配增量更新场景的固定宽度最优数值包围区间高效算法
适配需求的高效增量算法
核心前提优化
你的额外约束已经大幅降低了问题复杂度:区间宽度固定为全范围W = DU - DL的1/2^k(k为正整数),因此所有候选区间的边界天然对齐,总共有2^k个候选区间,第m个区间的范围为[DL + m*w, DL + (m+1)*w],其中w = W/2^k,m的取值范围是0 ≤ m < 2^k。
维护的数据结构
你只需要维护3个变量即可完成全流程增量更新:
- 计数数组
cnt:长度为2^k,cnt[m]表示当前数值集合中落在第m个候选区间的元素总数 - 滑动队列
recent_m:长度固定为N,存储最近N个观测值对应的区间下标m,用于快速计算占比 - 当前最优区间下标
m_opt:缓存上一次的最优区间,可选,可进一步降低遍历开销
单次更新流程(仅删1个旧元素、加1个新元素)
- 处理待移除的旧元素
计算旧元素对应的区间下标:m_old = floor((x_old - DL) / w)(若x_old刚好等于DU,直接归为最后一个区间即可),执行cnt[m_old] -= 1 - 处理待插入的新元素
计算新元素对应的区间下标:m_new = floor((x_new - DL) / w),执行cnt[m_new] += 1;同时将m_new加入recent_m队列,若队列长度超过N则弹出队首最旧的元素 - 查找最优区间
遍历cnt数组找到最大值对应的下标,若有多个最大值优先选最小的下标(更符合低压优先测试的场景),即为当前最优区间的下标m_opt - 计算准确率占比
统计recent_m队列中值等于m_opt的元素数量,除以N即可得到最近N个点落在最优区间的占比
效率分析
- 每次更新的时间复杂度为
O(2^k),一般晶圆测试场景下k不会超过10(对应区间宽度为全范围的1/1024),2^k=1024,遍历开销完全可以忽略,远低于暴力法的O(M)(M为集合总大小) - 若k确实很大(超过10),可以额外维护一个小顶堆存储
(-cnt[m], m),更新cnt的同时调整堆,即可在O(1)时间拿到最优区间下标,更新开销降为O(k)
场景适配验证
以你举的1.0V~2.0V全范围、k=1(区间宽度0.5V)的场景为例,候选区间仅2个:[1.0,1.5]和[1.5,2.0],每次更新仅需修改2个可能的cnt值,找最大值仅需对比2个数值,开销几乎为0,完全满足自动化测试的实时性要求。
内容的提问来源于stack exchange,提问作者PentiumPro200
相关产品推荐
相关产品推荐

