“Link–Cut Tree 维护的是一片 represented forest:这是用户语义中的动态有根森林。结构另外根据最近的 access 选择 preferred edges;每个顶点…”
伸展操作 ​
先按普通二叉搜索树搜索目标节点或最后访问节点,再重复旋转到根:父为根时做一次 zig;节点与父同为左孩子或同为右孩子时做 zig-zig,先转祖父再转父;方向相反时做 zig-zag,两次围绕节点旋转。split
Access lemma ​
令
zig-zig 同时显著缩短两层祖先链,是望远镜估计成立的关键;只把节点逐层单旋虽能移到根,却没有相同序列界。插入、删除可归约为常数次 access、split、join,因此摊还
访问序列例子 ​
若依次访问有序键
边界与开放问题 ​
树高可为
序列敏感界 ​
若键
删除可先伸展目标到根,使左右子树分离,再伸展左树最大节点并挂接右树。若搜索未命中,通常伸展最后访问节点以保留 access lemma;什么也不伸展会改变后续序列性质。
一次访问怎样偿还旋转 ​
设访问前路径为
Access lemma 用秩
沿一串操作相加时中间秩差望远镜消去,才得到
参考资料
- Daniel Sleator, Robert Tarjan, Self-Adjusting Binary Search Trees, JACM, 1985.
- Robert Tarjan, Sequential Access in Splay Trees Takes Linear Time, Combinatorica, 1985.