伸展树,保证从空树开始任意连续M次对树的操作最多花费O(MlogN)时间。
当M次操作的序列总的最坏情形运行时间为O(Mf(N))时,就说它的摊还运行时间为O(f(N))。
因此,一棵伸展树每次操作的摊还代价是O(logN)。
伸展树的基本思想是,当一个结点被访问后,它就要经过一系列AVL树的旋转被推到根上。
在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法, 在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。伸展树应运而生。伸展树是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。(维基)
在32个结点的树中访问1到9的结果:
参考Mark Allen Weiss《数据结构与算法分析c++描述》第三版,仅供学习交流之用,转发请注明原出处。