高级搜索树(上)

 

A1、伸展树:逐层伸展

A1-3 自适应调整

(1)让我们首先来看一个简单的例子:一个链表我们知道,在链接列表中,所有元素都是有组织的成线性序列,相邻元素包含对其前任和后继的引用。我们知道,在这样的数据结构中,访问元素的效率,主要取决于其顺序,更具体地说,排名较低或在列表中较早的元素具有更好的访问效率。另一方面,等级较高的后期元素效率较低。如果访问列表是完全随机的,那也许就是我们能做到的最好。

(2)改善空间很小,但是就像我们刚才提到的那样,如果访问列表中的元素符合局部性原则。我们可以用非常简单的策略,在整个数据集上实现更有效的访问。一种有效的策略是将元素移到列表的最前面,一旦被访问。这种策略背后的原因很容易理解。由于地域原因,我们下一步将访问的元素,很可能是我们刚刚访问的元素,这个元素刚刚被发送到列表的最前面,使其尽可能快地访问。
(3)从数据结构的生命周期来看,这样的列表结构,即使最初是随机排列的,也可以在多次访问后变成有序的,访问最多的元素将移到列表的最前面。我们知道,该地区的效率最高,这样我们可以实现更高的摊销效率,在足够长的时间间隔内。
好的,现在让我们回到二叉搜索树。了进行比较,我们将BST的典型图旋转了90度,并将根和叶对应到树上
,分别到列表的开头和结尾,这种对应是合理的,因为元素位于BST的根,与树中其他位置的元素相比,访问时间少得多。
特别是那些底部的,因此,如果我们希望优化BST的效率,我们可以参考我们对链接列表所做的操作,并移动我们经常使用的元素,离根更近或者换一种说法,降低身高
那么这个想法可能吗?
如果是,怎么办?

A1-4 逐层伸展


根据我们之前的分析,下一个要访问的节点,很可能是我们刚刚访问的节点
因此,提高未来访问的效率。最直接的方法是将我们刚刚访问的节点移到根
所以我们有一个非常简明的策略:节点v一旦被访问,随即转移至树根。
为了实现这一目标,我们所能借助的手段。除了我们刚刚介绍的等价变换之外。更具体地说,之字形和锯齿形

如果节点v是左子节点,我们与它的父级p一起执行zig转换,这样两个交换的高度。

另一方面,如果节点v是右子节点,我们对其父级p执行zag转换。同样,在此调整之后,两个节点交换高度
总而言之,无论经过一次zig旋转还是zag旋转,节点v都可以在高度上上升一层。因此我们可以重复应用此策略,是v的高度逐层上升,直到v最终会到达根

A1-5 实例

让我们来看一个例子。这是BST。假设我们要找到333,基于我们以前的策略,我们需要通过zig或zag转换序列将该元素移至根

让我们详细看一下这个过程


(1)从333开始,我们首先注意到它是一个右孩子,所以我们寻找它的父亲285,并进行右旋转,333上升一层。

(2)接下来,它仍然是一个右孩子。所以我们再次找到它的父亲021。并进行zag旋转

(3)现在333是一个左孩子,我们需要执行zig旋转,对它的当前父亲448。因此333的高度上升了一层


(4)这个过程可以继续,对我们的新父亲468顺时针旋转。


(5)最后一个父亲是641,做顺时针旋转、
我们可以看到333通过一系列的Zig和Zag变换,到达树根。这样以后访问它似乎只需常数时间。如果将节点的调整过程连贯来看,我们将返现这个节点逐层上升过程。是一个左右摇摆,不断伸展的过程。这是名字splay(伸展)的来源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值