“单次对抗插入可触发大窗口重排,低尾延迟需去摊还化。墓碑删除若不计入密度会让扫描充满空洞。标签顺序与物理地址不是同一保证;仅有 order maintenance 标签不能推出连续范围扫描。”
形式陈述 ​
目标与不变量 ​
摊还分析只保证长度为
常用构造维护旧结构
直觉
摊还证明说明未来一段操作“总有足够的钱”偿还一次大工作,去摊还化则把这笔工作提前拆成有截止期的小任务。每个公开操作领取固定迁移预算;只要任务产生率低于处理率,并且旧、新状态在过渡期都有明确权威关系,昂贵峰值就能被铺平成逐操作最坏界。
例子与边界
去摊还化的目标是把总工作平滑到每次操作,给出逐操作最坏界;全局重建本身只说明何时批量恢复结构,stop-the-world 实现仍可能产生一次
增量扩容的账 ​
容量
覆盖尚未迁移的下标后,旧副本必须更新或记录新值,否则稍后复制会让旧值复活。若每步只搬一项而每次更新制造两个待迁移项,积压持续增长,“每步做一点”并未给最坏界。
边界 ​
去摊还化不是从任意摊还证明自动生成。工作必须能切成保持可查询状态的微步,旧版与新版能在受控空间内并存,迁移处理率还要追上新任务的到达率。下一次重建若在旧迁移结束前触发,双结构会叠成三结构,原空间与延迟界都需重新证明。
确定性每步预算才能给 deterministic worst-case;重建规模或迁移进度只以高概率受控时,只能声称 high-probability worst-case。后台线程若可能被调度器长期饿死,抽象工作量界也不能直接解释为 wall-clock 截止期。
写入并发时的版本协议 ​
迁移期间把每个逻辑槽分成“尚未复制、正在复制、已经复制”三态。写操作先读取状态:尚未复制时同时更新旧值和一条 redo 记录;正在复制时用短锁或版本号防止复制线程读到撕裂值;已经复制时只写新结构。复制步骤在发布新值前再次检查版本,若期间发生写入就重放最新记录。这样可在线性化点上解释每次读写,而不只是最终集合相等。
删除也不能简单清空旧槽。若复制线程已经读出元素、尚未写入新区,删除须留下 tombstone 并让复制提交前检查;否则被删元素会复活。使用双写则省日志读取,却把每次更新常数和缓存写流量增大,属于实现权衡。
成本与空间全账 ​
若普通操作成本
对动态数组例子,复制
参考资料
- Mark Overmars, The Design of Dynamic Data Structures, Springer, 1983.
- Paul Dietz, Daniel Sleator, “Two Algorithms for Maintaining Order in a List,” STOC 1987.
- Erik D. Demaine, MIT 6.851 Advanced Data Structures, deamortization notes, accessed 2026.