伸展树(Splay Tree)的深度理解

本文详细探讨了伸展树的原理,旨在理解其核心思想——通过变换树结构优化访问速度。文章指出,单层旋转在某些情况下会导致树结构不平衡,尤其是连续同方向旋转时。为解决这一问题,提出了双层旋转的优化策略,避免路径元素的叠加,从而保持树的平衡状态,确保高效访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

伸展树(Splay Tree)的深度理解

伸展树作为一种非常受欢迎的数据结构,其最初的想法(标记为想法一)是通过变换树的结构将最近访问的元素置于树根,倘若一系列操作都是和该元素有关,那么在变成树根之后将极大的提高该元素的访问速度。基于该想法,每次访问该元素时,沿着访问路径,逐层进行简单的单层旋转,从而使该元素的深度减小,最后变成树根。

图1
(P表示路径path,V表示访问visit)
(这是左旋,对应的有右旋,没有画出来)

实际应用中,多次连续的操作也可能是访问不同的元素,所以不得不考虑其他元素的访问速率问题。所以进一步的想法(标记为想法二)是,如果在树根化的过程中,能够使树的整体结构更加平衡,那么不仅可以把当前元素置于树根,而且也方便了其他元素的访问。

但是,大家不要对想法二想得过于完美。因为目标元素的树根化过程只和路径上的元素息息相关。所以想法二中的平衡只是针对路径上的元素,而其他元素的平衡问题就“照顾”不到了。

那么路径上的元素都被旋转到哪里了呢?

(本文的关键内容从这里开始)

不妨观察一下上面的单层旋转示意图,通过左旋,P节点变换到了V节点的右边,也就是说进入到了V节点的右子树(也就是b块),这个时候如果下一次旋转又是一个左旋,P又会进入到b块中。那么考虑到一般的情形,如果连续的遇到左旋(或者右旋),那么b块(或者a块)就会变得“臃肿”,使得变换后的树结构不平衡。如果是遇到“左右左右左右左右…”的情况,a块和b块就会相对平衡一些,单层旋转是行得通的,但是这种好的情况的出现是小概率的。所以在一般情况下,单层旋转的策略表现非常差劲。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值