伸展树学习笔记之逐层伸展
伸展树
一. 局部性
- Locality: 刚被访问过的数据,极有可能很快地再次被访问,这一现象在信息处理过程中屡见不鲜。
- BST: 刚刚被访问过的节点,极有可能很快地再次被访问;下一个将要访问的节点,极有可能就在刚被访问过节点的附近。
- 连续的m次查找(m>>n=|BST|),采用AVL共需O(mlogn)时间
二. 自适应调整
对于典型的线性结构列表,所有元素按照它们之间的逻辑关系,排列成一个线性的序列。相邻的元素通过引用,确立前驱和后继关系。对任何一个元素的访问效率,将主要取决于它在这个序列中所具有的秩。
- 越靠前的元素,秩越小,访问的效率越高
- 越靠后的元素,秩越大,访问的效率越低
一旦有某个元素刚刚接受访问,立即将它移动到这个序列的最前端。因为根据局部性,接下来要访问的元素,很有可能就是我们刚刚访问的那个元素的。
经过了足够长时间的使用之后,某一时间内,被集中访问的那些元素,都会集中到这个列表的前端去,提高访问效率。
将BST树的画法旋转90度,在BST位于顶部的元素,访问效率相对要高,可以借助局部性,将经常要访问的元素,尽可能移送到更加接近树根的位置,也就是要尽可能地降低它们的深度。
三. 旋转
3.1 之字形
栗子.......................................................................................................................
3.2 一字形
栗子.......................................................................................................................
栗子1:................................................................................................................................
栗子2:................................................................................................................................
栗子3:................................................................................................................................
栗子4:................................................................................................................................
四. 逐层伸展
访问一次结点 ,完成一次称为展开的过程
- 节点v一旦被访问,随即转移至树根,通过zig或者zag变换
- 自下而上,逐层单旋
- zig(v->parent)
- zag(v-parent)
- 指到v最终被推送至根
五. 例子
step1: 需要访问333
step2:
step3:
step4:
step5:
step6: 最终抵达树根
六. 最坏情况
七. 插入Insert
八. 联合Join
九 删除Delete
(参考:https://web.stanford.edu/class/cs166/lectures/10/Slides10.pdf)