上周五夜里三点多更了一篇博客 初识splay tree (一) ,却只来得及写了一道简单模板题。今天补充一些关于splay tree 的实质性的内容。
splay 的产生:
splay 诞生的出发点是基于节点 [访问局部性] 的启发式优化:
Wiki
伸展树(英语:Splay Tree)是一种二叉查找树,它能在O(log n)内完成插入、查找和删除操作。它是由丹尼尔·斯立特(Daniel Sleator)和罗伯特·塔扬在1985年发明的1。在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法, 在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。伸展树应运而生。伸展树是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。
splay可以解决的问题
可以看出splay树同样是二叉查找树的一种,核心在于每次访问都把该节点提至根(通过旋转操作:zig、zag),可以证明这种方法使得各种操作均摊复杂度最坏为log(N),证明过程详细见