zoukankan      html  css  js  c++  java
  • 邓俊辉数据结构学习-8-1-伸展树

    高级搜索树--伸展树

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

    要求:

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

    概述

    背景知识补充:

    数据局部性

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

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

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

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

    逐层伸展

    现在,我们希望通过某种手段让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一样
    • 最强优点: 在数据局部性强的时候,经过一定使用时间后,使用伸展树可以达到O(logK)的时间复杂度
    • 缺点: 在单次敏感的场合不适合使用
  • 相关阅读:
    将博客搬至CSDN
    Redis快速入门详解
    Linux下离线安装MySQL
    Git-如何将已存在的项目提交到git
    linux下修改完profile文件的环境变量后如何立即生效
    Redis允许远程连接
    Spring Boot中使用Swagger2构建强大的RESTful API文档
    JVM内存结构
    java类的加载机制
    linux 内存查看
  • 原文地址:https://www.cnblogs.com/patientcat/p/9720322.html
Copyright © 2011-2022 走看看