范式与三项证明义务 ​
设动态结构的每个区域
一个完整分析必须给出三项内容:触发阈值是什么;重建后恢复到离阈值多远;从上次恢复到本次触发之间,至少发生了多少次能向该区域收费的更新。若只说“偶尔平衡一下”,就没有摊还证明。
局部摘要如子树大小、密度或墓碑数通常由搜索树增强维护。重建会替换一整片内部表示,父节点指向新根后仍须自底向上修复祖先摘要。
Scapegoat Tree 主例子 ​
固定
其中
的 scapegoat 节点
重建后,
祖先收费为何只有对数层 ​
一次更新可能给搜索路径上多个候选区域增加坏度量。若平衡不变量保证树高
例如一个含
Subtree、Bucket 与增量重建 ​
Subtree rebuild 替换一棵失衡子树;bucket rebuild 只整理某个叶桶、哈希桶或块内数组;二者的收费对象分别是经过祖先的更新和落入该桶的更新。触发事件与被收费操作必须匹配,不能让另一区域的更新虚构信用。
增量重建把
与全局重建的区分 ​
全局重建用一次扫描恢复整个容器,收费通常来自全局规模或负载的几何变化。局部重建只触及坏区域,能避免无关数据停顿,却引入祖先重叠和局部阈值的证明负担。
旋转是常数规模的持续修复;局部重建是线性于区域大小的间歇修复。Weight-balanced tree、scapegoat tree 与分桶索引可能在两者之间取舍,但不能把它们的最坏或摊还界混写。
失败边界 ​
若重建后仍贴着触发阈值,下一次更新就可能再次花
删除还可能让许多嵌套区域同时稀疏。必须规定选择最小、最高还是第一个坏祖先,并证明未选区域的坏度量不会失控。持久化结构中的旧版本不能贡献给新版本可重复消费的同一信用。
参考资料
- Igal Galperin and Ronald L. Rivest, “Scapegoat Trees,” SODA, 1993.
- Mark H. Overmars, The Design of Dynamic Data Structures, Springer, 1983.
- Arne Andersson, “Balanced Search Trees Made Simple,” WADS, 1993.