【0】README

0.1) 本文总结于 数据结构与算法分析,核心剖析路线为原创, 旨在理清 自底向上伸展树(之字形旋转+一字形旋转) 的基本思路;
0.2) 自底向上伸展树 是基于 AVL树,for detailed AVL, please visit http://blog.csdn.net/pacosonswjtu/article/details/50522677 ;
0.2) 对于伸展树的实现而言, 自顶向下伸展树只用到了O(1)的额外空间,且能够保持O(logN)的摊还时间界,通常推荐自顶向下伸展树的应用;for detailed top-down splay tree, please visit http://blog.csdn.net/pacosonswjtu/article/details/50609414 (干货——推荐自顶向下伸展树的应用)


【1】伸展树(之字形旋转+一字形旋转)

1.1)定义:

  • 伸展树保证从空树开始任意连续M次对树的操作最多花费 O(M logN)时间;

1.2)摊还运行时间:

  • 当 M 次操作的序列总的最坏情形运行时间为 O(MF(N))时,我们就说它的摊还运行时间为 O(F(N)), 因此一颗伸展树 每次操作的摊还代价是 O(log N);(摊还 == 分期偿还)

1.3)如果任意特定操作可以有最坏时间界O(N), 而我们仍然要求一个 O(logN)的摊还时间界, 那么很清楚, 只要一个节点被访问, 它就必须被移动。 否则,一旦我们发现一个深层节点,我们就有可能不断对它进行find 操作。 如果这个节点不改变位置, 而每次访问又花费 O(N), 那么M次访问将花费 O(M * N)的时间;
1.4)引入伸展树的原因:

  • 如果任意特定操作可以有最坏时间界O(N), 而我们仍然要求一个 O(logN)的时间复杂度, 显然,为了达到这个目标,只要一个节点被访问了,那么它必须被移动。否则,一旦我们发现一个深层节点,我们就有可能不断对它进行find操作。 如果这个节点不改变位置, 而每次访问又花费了 O(N), 那么M次访问将花费O(MN)的时间; (干货——引入伸展树的原因)

1.5)伸展树的基本想法: (干货——伸展树的基本想法)

  • 1.5.1)当一个节点被访问后, 它就要经过一系列AVL 树的旋转被放到根上。注意, 如果一个节点很深,那么在其路径上就存在许多的节点也相对较深,通过重新构造可以使对所有这些节点的进一步访问所花费的时间变少。
  • 1.5.2)因此,如果节点过深,那么我们还要求重新构造应该具有平衡这棵树(到某种程度)的作用;除了在理论上给出好的时间界外, 这种方法还可能有实际的效用(reasons);
    • r1)因为在许多应用中当一个节点被访问时, 它就很可能不久后再被访问到;
    • r2)另外, 伸展树还不要求保留高度或平衡信息, 因此它在某种程度上节省空间并简化代码;

【2】一个简单的想法(不过行不通)

2.1)执行单旋转:实施上面描述的重新构造的一种方法是执行单旋转,从下到上进行;
2.2)不过这种方法效率不是很高:因为这些旋转的效果是将 k1 一直推向树根,使得对 k1 的进一步访问很容易,不足的是它把另外一个节点 k3 几乎推向和k1以前同样的深度;
2.3)结论(这个想法还不够好):虽然这个策略使得对 k1 的访问花费时间减少,但是它并没有明显的改变访问路径上其他节点的状况;

【3】展开(因为章节2中的方法行不通,所以才有伸展树的展开)

我们仍然是从底部向上沿着访问 路径旋转;
3.1)令X 是在访问路径上的一个节点, 我们将在这个路径上实施旋转操作。

  • 3.1.1)如果X 的父节点是树根, 那么我们只要旋转X 和树根;(这是沿着路径上的最后的旋转)(干货——单旋转定义)
  • 3.1.2)否则, X就有父亲P 和 祖父G, 存在两种情况需要考虑:

    • case1)第一种情况是 之字形:我们就执行一次AVL 那样的双旋转;(访问节点X是P的右儿子, 而父亲P是G的左儿子的形式;或者访问节点X是P的左儿子, 而父亲P是G的右儿子的形式)(干货——之字形旋转情形的定义,即访问节点X 介于父节点P 和 祖父节点G 之间,确切地说是 P≤X≤G)

    • case2)第二种情况是 一字形:我们就把左边的树变成右边的树;(访问节点X 和 父亲P 都分别是父亲P和祖父G的左儿子,或者都是右儿子) (干货——一字形旋转情形的定义 ,即访问节点X 不介于父节点P 和 祖父节点G 之间,确切地说是 X≤P≤G 或 G≤P≤X)

3.2)对展开操作的分析(Analysis)

  • A1)展开操作不仅将访问 的节点移动到根处,而且还有把访问路径上的大部分节点的深度大致减少一半的效果(某些浅的节点最多向下推后两个层次)
  • A2)下图中指出 关键字为1的节点展开的结果 。区别在于:在对关键字1的节点访问(花费N-1个单元的时间)之后,对关键字为2的节点的访问只花费 N/2 个时间单元而不是 N - 2个时间单元;

自底向上伸展树(之字形旋转+一字形旋转)相关推荐

  1. PHP算法 《树形结构》 之 伸展树(1) - 基本概念

    伸展树的介绍 1.出处:http://dongxicheng.org/structure/splay-tree/ A. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Bin ...

  2. 伸展树(Splay Tree)尽收眼底

    原文地址:http://dsqiu.iteye.com/blog/1706592 伸展树(Splay Tree)尽收眼底 本文内容框架: §1 伸展树定义 §2 伸展树自底向上伸展   §3 伸展树自 ...

  3. 伸展树 自底向上 自顶向下

    伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造.它的优势在于不需要记录用于平衡树的冗 ...

  4. 【数据结构笔记12】平衡二叉树,AVL树,RR旋转/LL旋转/LR旋转/RL旋转,AVL树插入的代码实现

    本次笔记内容: 4.2.1 什么是平衡二叉树 4.2.2 平衡二叉树的调整 文章目录 什么是平衡二叉树 评价查找长度ASL 平衡因子(Balance Factor,BF) 平衡二叉树(Balanced ...

  5. 伸展树算法c语言,数据结构之伸展树详解

    1. 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Binary Sort Tree)能够支持多种动态集合操作,它可以用来表示有序集合.建立索引等,因而在实际应用中,二叉排 ...

  6. 数据结构与算法专题——第十题 输入法跳不过的坎-伸展树

    我们知道AVL树为了保持严格的平衡,所以在数据插入上会呈现过多的旋转,影响了插入和删除的性能,此时AVL的一个变种伸展树(Splay)就应运而生了,我们知道万事万物都遵循一个"八二原则&qu ...

  7. 高级数据结构实现——自顶向下伸展树

    [0]README 1) 本文部分内容转自 数据结构与算法分析,旨在理解 高级数据结构实现--自顶向下伸展树 的基础知识: 2) 源代码部分思想借鉴了数据结构与算法分析,有一点干货原创代码,for o ...

  8. HYSBZ 1588 营业额统计 伸展树

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意: Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任 ...

  9. 数据结构--伸展树(伸展树构建二叉搜索树)-学习笔记

    2019/7/16更新:封装SplayTree进入class:例题:http://poj.org/problem?id=3622 一个伸展树的板子: #include<stdio.h> # ...

最新文章

  1. (6)解构赋值的用途
  2. gossip协议与memberlist实现
  3. python3 字典 dict 常见用法总结(判断key是否存在)
  4. android.view.InflateException: Binary XML file line #34: Error inflating class
  5. windows和linux命令行一样吗,微软改进Windows命令行 目的是和Linux命令行相抗衡
  6. P5127-子异和【线段树,树链剖分,位运算】
  7. 第二十五期:搞定Linux Shell文本处理工具,看完这篇集锦就够了
  8. 【操作系统复习】操作系统的特征
  9. 2091: [Poi2010]The Minima Game
  10. Python中的AES加解密算法
  11. 2021计算机视觉-包揽所有前沿论文源码 -上半年
  12. vue引入高德地图获取经纬度地址
  13. 三段式状态机的写法总结
  14. 高中信息技术新课程标准
  15. 【清华大学陈渝】第五章 虚拟存储
  16. unity运行时修改光源的颜色,变成白色
  17. MySQL day()函数
  18. ethereum扫描区块,获取区块内的交易记录
  19. 书籍_《未来世界的幸存者》阮一峰--2/5
  20. 电脑清空企业微信聊天记录

热门文章

  1. CF1004F Sonya and Bitwise OR
  2. P4064 [JXOI2017]加法
  3. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)
  4. 2021牛客暑期多校训练营3A-Guess and lies【dp】
  5. jzoj6312-Lottery【dp,前缀和】
  6. nssl1317-灵魂分流药剂【分组背包,二维费用背包】
  7. 欢乐纪中某B组赛【2019.1.26】
  8. jzoj1370-飞船【RMQ初见】
  9. 【模板】KMP算法、fail树
  10. 【ST表】栈(jzoj 2295)