1008-1-邓俊辉数据结构学习笔记 8.1-伸展树

高级搜索树

伸展树

对于维护平衡因子,感觉很麻烦,希望抛弃掉平衡因子,使用更加潇洒的模式。

要求:

  1. 对于伸展树来说,也不做过多掌握
  2. 主要明白利用数据的局部性,我们可以实施的新策略

概述

背景知识补充:

数据局部性

  • 刚被访问过得数据很快会被再次访问

因此这一次访问过的节点,极有可能再次被访问, 能够实现这种特性的树就是伸展树–就像自适应链表一样

  • 新的名词: 自适应链表
    • 在某一段时间内,将经常需要访问的元素尽可能的放到链表前面
    • 大概实现:就是将上次访问过的节点移动到链表的前端

电脑缓存会充分利用数据的局部性, 因此电脑往往在使用一段时间后就会变的更顺畅

逐层伸展

现在,我们希望通过某种手段让BST实现诸如自适应链表的功能。该怎么做?

按照惯用逻辑,我们手里只有基本变换这唯一工具。因此我们可以使用我们的基本变换将目标节点一步一步地
往上爬,上升到根的位置。

可惜的是,这种方法在最坏情况下分摊复杂度为O(N)意味着等同线性序列,不能接受。

双层伸展

双层伸展通过改变zig-zig和zag-zag的方式实现画龙点睛的作用,让伸展树在伸展的时候会折叠路径,因此,
在经过最坏情况下的一次查找之后,新的伸展树高度会减半。从而分摊时间复杂度达到O(logN)。

具体变换如图所示

  • zig-zag和不同的一样
    d8ea93974814b5518728205cb654a438.jpeg
  • zig-zig改变了次序,以前是先zig p节点,然后zig g节点,现在使用倒序
    f4a2905cd5643d31c162d8433d95d6dd.jpeg

有关splay还需要注意的一个地方是编程问题,就是树的深度为偶数或者奇数的时候会有点小小的不一样。
这个我们假设3,4个节点就可以具体解决。

综合评价

  • 无需判断平衡因子,因此也无需记录高度,编程方便了一些
  • 操作的时间复杂度和AVL一样
  • 最强优点: 在数据局部性强的时候,经过一定使用时间后,使用伸展树可以达到O(logK)的时间复杂度
  • 缺点: 在单次敏感的场合不适合使用

猜你喜欢

转载自blog.csdn.net/weixin_43468441/article/details/83188537