Skip to content

伸展树

splay tree · 伸展树

每次访问后把目标旋至根,并以势能获得序列敏感摊还界的自调整搜索树。

条目类型
模型

形式陈述

伸展操作

伸展树是同时属于二叉搜索树自调整数据结构的结构:先按普通 BST 搜索目标节点或最后访问节点,再重复旋转到根:父为根时做一次 zig;节点与父同为左孩子或同为右孩子时做 zig-zig,先转祖父再转父;方向相反时做 zig-zag,两次围绕节点旋转。split(x) 先伸展 x,再断开一侧;join(L,R) 伸展 L 的最大键后接上 R

Access lemma

s(v) 为子树大小、r(v)=logs(v),势为 Φ=vr(v)。一次伸展访问 x 的摊还旋转成本满足

c^3(r(root)r(x))+1=O(logn).

zig-zig 同时显著缩短两层祖先链,是望远镜估计成立的关键;只把节点逐层单旋虽能移到根,却没有相同序列界。插入、删除可归约为常数次 access、split、join,因此摊还 O(logn)

直觉

伸展把本次访问路径整体重排,而不维护颜色或高度证书。zig-zig 与 zig-zag 让被访问节点上升的同时压缩其祖先路径;子树秩势记录这次重排积累或释放的结构能量,所以单步可线性,整段访问仍有对数摊还和更细的序列敏感界。

zig-zig 前后的父子关系
例子与边界

访问序列例子

若依次访问有序键 40,41,42,第一次可能沿长路径伸展 40,但其邻近区域被带到树顶,随后两个访问路径迅速缩短。更一般地,working-set 界让最近访问过且期间不同键较少的元素便宜,dynamic-finger 界让相邻秩访问便宜;这比“常用键靠近根”的口号更精确。

边界与开放问题

树高可为 Θ(n),单次访问也可线性;保证属于整个序列的摊还成本,不是最坏延迟。static optimality、working-set 与 dynamic-finger 都已证明,但“与任意离线最优 BST 相差常数”的动态最优猜想截至 2026 年 8 月 10 日仍未解决。

2026 年 7 月 20 日的一份 arXiv v1 预印本给出了显著的新上界:伸展树相对离线最优动态 BST 为

O(loglogn(logloglogn)2)=O~(loglogn)

竞争,并称这是首个 o(logn) 的通用竞争比。它把已知差距从对数级压到近双对数级,却仍不是常数竞争比,因此没有解决动态最优猜想;在形成稳定的同行评议结论前,本页把它明确标为预印本结果。重复键、未命中搜索后伸展哪个节点、删除如何 join 仍都需固定语义。

推论与应用

伸展树没有显式平衡字段,其访问界由势能法证明:以节点子树大小的对数秩求和为势,zig-zig 与 zig-zag 的旋转成本由秩下降支付。

序列敏感界

若键 x 自上次被访问后出现过 t(x) 个不同键,working-set theorem 给本次访问 O(log(t(x)+1)) 摊还成本;刚访问过的热点因而接近常数。Dynamic-finger theorem 以上一次访问键 yx 的秩距离控制 O(log(|rank(x)rank(y)|+1))。这两条都比单纯 O(logn) 更强,却仍是整段序列的摊还陈述。

删除可先伸展目标到根,使左右子树分离,再伸展左树最大节点并挂接右树。若搜索未命中,通常伸展最后访问节点以保留 access lemma;什么也不伸展会改变后续序列性质。

一次访问怎样偿还旋转

设访问前路径为 8465。伸展 5 时先对 4、6、5 做 zig-zag,把 5 提到 8 的孩子,再做一次 zig 成为根;中序次序始终为 4<5<6<8,因此旋转改变形状却不改变字典语义。访问结束后,刚访问的 5 在根部,路径上的其他节点也被重新分成较浅的两侧。

Access lemma 用秩 r(v)=logs(v) 记子树权重,单次伸展的摊还代价至多

3(r(new root)r(x))+1.

沿一串操作相加时中间秩差望远镜消去,才得到 O(logn) 摊还访问。它并不限制一次伸展的旋转数;一条长度 n 的链上首次访问末端仍可能花 Θ(n)

参考资料
  • Daniel Sleator, Robert Tarjan, Self-Adjusting Binary Search Trees, JACM, 1985.
  • Robert Tarjan, Sequential Access in Splay Trees Takes Linear Time, Combinatorica, 1985.
  • Petr Chmel et al., Splay Trees Are Almost Dynamically Optimal, arXiv:2607.18498v1, 20 July 2026.
关系图谱4 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。

类型化关系

使用的工具