“Link–Cut Tree把 preferred path 存成辅助 splay,路径聚合直接,但整树/虚子树信息需额外维护。Euler Tour Tree把整棵分量表示为序列,擅长连通与分…”
三层对象不能混为一棵树 ​
Link–Cut Tree 维护的是一片 represented forest:这是用户语义中的动态有根森林。结构另外根据最近的 access 选择 preferred edges;每个顶点至多有一条指向 preferred child 的边,因此 preferred edges 把 represented forest 分成若干条 preferred paths。每条路径再由一棵辅助 伸展树按 represented depth 的顺序保存。
所以同时存在三种关系:
- represented parent:森林中真正的父子关系;
- preferred/path-parent:一条辅助路径与上一条路径的连接;
- auxiliary parent:伸展树旋转所维护的父指针。
Splay 旋转只能改变 auxiliary parent 和路径表示,不能改写 represented forest。把这三种父指针视为一个字段而不维护相应语义,是 Link–Cut 实现最危险的错误来源。
接口与复杂度 ​
对
:把 represented root 到 的路径变成一条 preferred path; :把 变成所在 represented tree 的根; :返回 represented root; :仅当 在不同树中时加入边; :删除已存在的 represented edge; :聚合简单路径 。
预处理孤立顶点为
access 如何改写 preferred paths ​
概念上,
- splay
,使 成为当前辅助树根; - 原右子树表示
下方旧的 preferred 后缀,把它断开为 virtual 连接; - 把 last 接为
的右子树,使刚访问过的下一段成为新 preferred 后缀; - 更新聚合,令 last=
,继续到上一条 preferred path。
最后再 splay
换根、连边、断边与路径摘要 ​
要查询
此时
为什么是对数摊还 ​
对辅助伸展树使用 access lemma 的秩势
其中
这一区别很重要:单次 access 可以改变许多 preferred children,单棵辅助树也可以暂时很高。保证来自整串操作上的势能,而非每个时刻存在一棵高度对数的平衡树。
具体例子:暴露任意两点路径 ​
设 represented tree 含路径
随后 cut
失败边界与近邻结构 ​
原生 Link–Cut Tree 把路径变成辅助树中的连续序列,因此路径和、最大值、仿射复合等最自然。整棵 represented subtree 的顶点散落在多条 preferred paths 和 virtual children 中;要支持动态子树聚合必须额外维护 virtual contribution,并处理 access 时贡献进出,不能从路径摘要自动得到。
非交换运算必须保留方向:字符串拼接或矩阵乘法在
参考资料
- Daniel D. Sleator and Robert E. Tarjan, “A Data Structure for Dynamic Trees,” Journal of Computer and System Sciences 26(3), 1983, 362–391.
- Robert E. Tarjan, Data Structures and Network Algorithms, SIAM, 1983, dynamic trees chapter.
- Erik D. Demaine, Advanced Data Structures, MIT 6.851 lecture notes, dynamic trees.