标签:avl 目标 链表 双层 方便 位置 前端 自适应 还需
对于维护平衡因子,感觉很麻烦,希望抛弃掉平衡因子,使用更加潇洒的模式。
要求:
背景知识补充:
数据局部性
因此这一次访问过的节点,极有可能再次被访问, 能够实现这种特性的树就是伸展树--就像自适应链表一样
电脑缓存会充分利用数据的局部性, 因此电脑往往在使用一段时间后就会变的更顺畅
现在,我们希望通过某种手段让BST实现诸如自适应链表的功能。该怎么做?
按照惯用逻辑,我们手里只有基本变换这唯一工具。因此我们可以使用我们的基本变换将目标节点一步一步地
往上爬,上升到根的位置。
可惜的是,这种方法在最坏情况下分摊复杂度为O(N)意味着等同线性序列,不能接受。
双层伸展通过改变zig-zig和zag-zag的方式实现画龙点睛的作用,让伸展树在伸展的时候会折叠路径,因此,
在经过最坏情况下的一次查找之后,新的伸展树高度会减半。从而分摊时间复杂度达到O(logN)。
具体变换如图所示
经过俩次zigzig变换, 需要注意的是我们要先从g,即祖父节点开始变换,然后才开始在p变换
.─. .─.
( g ) ( v )
`─‘? ?`─‘?
? ? ? ?
.─.? ? .─. ? ?.─.
( p ) ■ ( p ) ■ ( p )
`─‘? ■ ■ ? `─‘ ? ■ ■ ?─‘?
? ? ■T3 ■ ? ? ■T0 ■ ? ?
.─.? ? ■■■■■■■ .─.? ? .─. ■■■■■■■ ? ?.─.
( v ) ■ ( v ) ( g ) ■ ( g )
?`─‘? ■ ■ ?`─‘? ?`─‘? ■ ■ ?`─‘?
? ? ■T2 ■ ? ? ? ? ■T1 ■ ? ?
? ? ■■■■■■■ ? ? ? ? ■■■■■■■ ? ?
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■T0 ■ ■T1 ■ ■T0 ■ ■T1 ■ ■T2 ■ ■T3 ■ ■T2 ■ ■T3 ■
■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■
根据图可以看出,v的左树没有发生变化,g的右树也没有发生变化
zag-zig的情况变换还和之前一样
.─. .─.
( g ) ( g )
`─‘? `─‘?
? ? ? ? .─.
.─.? ■ .─.? ■ ( v )
( p ) ■ ■ ( v ) ■ ■ ?`─‘?
`─‘? ■T3 ■ ?─‘? ■T3 ■ ? ?
? ? ■■■■■■■ ? ? ■■■■■■■ ? ? .─.
? ?─. .─.? ?■ .─. ( g )
■ ( v ) ( p ) ■ ■ ( p ) ?`─‘?
■ ■ ?`─‘? ?`─‘? ■T1 ■ ?`─‘? ? ?
■T2 ■ ? ? ? ? ■■■■■■■ ? ? ? ?
■■■■■■■? ■ ■ ? ? ? ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■T0 ■ ■T1 ■ ■T2 ■ ■ ■ ■ ■ ■ ■ ■T1 ■ ■T3 ■
■■■■■■■ ■■■■■■■ ■■■■■■■ ■T0 ■ ■T2 ■ ■T0 ■ ■■■■■■■ ■■■■■■■
■■■■■■■ ■■■■■■■ ■■■■■■■
有关splay还需要注意的一个地方是编程问题,就是树的深度为偶数或者奇数的时候会有点小小的不一样。
这个我们假设3,4个节点就可以具体解决。
标签:avl 目标 链表 双层 方便 位置 前端 自适应 还需
原文地址:https://www.cnblogs.com/patientcat/p/9720322.html