数据结构----伸展树

22、伸展树与自调整数据结构 本文深入探讨了伸展树(Splay Tree)作为一种典型的自调整二叉搜索树,介绍了其基本原理、操作方法及应用场景。文章还讨论了如何在伸展树中维护额外信息以增强功能,并比较了其他类型的自调整数据结构。通过实例分析,帮助读者更好地理解和选择适合特定场景的数据结构,提升程序性能和效率。 阅读详情

伸展树SPlay tree

只要理解了AVL的旋转过程,伸展树基本就能够明白的了,伸展树有个神奇之处在于把访问的节点旋转至根节点,可以实现区间删除,寻找前驱后驱等等。。。感觉伸展树比那些主席树,划分树作用更大似的,因为我能够知道用伸展树来干嘛,而其他数除了求第K大的值之外不知拿来干嘛,说到底还是做题太少,见识太少。,。需要好好熟悉理解Splay的代码。。。。。大牛都说简单,然而让我自己默写都写不出来QAQ


进入正题:

参考链接:

1点击打开链接

数据结构之伸展树

伸展树(Splay tree)学习小结

HNOI2002]营业额统计 Splay tree 

参考论文:

1)     杨思雨《伸展树的基本操作与应用》

(2)     Crash《运用伸展树解决数列维护问题》


首先要理解旋转方式:一共有六种,镜像3种,其实就是理解3种就能够明白了。(zig 右旋     zag 左旋)

x   目标结点   

y   x的父结点

z   y的父结点

1.     当y为根结点,进行一次zig或zag

2      y不是根结点,当x,y同时是各自父结点的左子树或右子树,进行两次zig或zag (可以自顶向下,也可以自底向上)

3     y不是根结点,当x,y其中一个是父结点的左子树,另一个是右子树,进行一次zag,一次zig


代码中的旋转函数比较难理解,需要会画图就容易理解了,记住需要左旋的图和右旋的图,

代码中的示例图:


① 为代码中的ch[y][!kind]=ch[x][kind];              ②pre[ch[x][kind]]=y;  (当kind=0的情况,kind=1类似)


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、Splay 概述

二叉查找树(Binary Search Tree,也叫二叉排序树,即Binary Sort Tree)能够支持多种动态集合操作,它可以用来表示有序集合、建立索引等,因而在实际应用中,二叉排序树是一种非常重要的数据结构。

从算法复杂度角度考虑,我们知道,作用于二叉查找树上的基本操作(如查找,插入等)的时间复杂度与树的高度成正比。对一个含n个节点的完全二叉树,这些操作的最坏情况运行时间为O(log n)。但如果因为频繁的删除和插入操作,导致树退化成一个n个节点的线性链(此时即为一个单链表),则这些操作的最坏情况运行时间为O(n)。为了克服以上缺点,很多二叉查找树的变形出现了,如红黑树、AVL树,Treap树等。

本文介绍了二叉查找树的一种改进数据结构–伸展树(Splay Tree)。它的主要特点是不会保证树一直是平衡的,但各种操作的平摊时间复杂度是O(log n),因而,从平摊复杂度上看,二叉查找树也是一种平衡二叉树。另外,相比于其他树状数据结构(如红黑树,AVL树等),伸展树的空间要求与编程复杂度要小得多。

2、 基本操作

伸展树的出发点是这样的:考虑到局部性原理(刚被访问的内容下次可能仍会被访问,查找次数多的内容可能下一次会被访问),为了使整个查找时间更小,被查频率高的那些节点应当经常处于靠近树根的位置。这样,很容易得想到以下这个方案:每次查找节点之后对树进行重构,把被查找的节点搬移到树根,这种自调整形式的二叉查找树就是伸展树。每次对伸展树进行操作后,它均会通过旋转的方法把被访问节点旋转到树根的位置。

为了将当前被访问节点旋转到树根,我们通常将节点自底向上旋转,直至该节点成为树根为止。“旋转”的巧妙之处就是在不打乱数列中数据大小关系(指中序遍历结果是全序的)情况下,所有基本操作的平摊复杂度仍为O(log n)。

伸展树主要有三种旋转操作,分别为单旋转,一字形旋转和之字形旋转。为了便于解释,我们假设当前被访问节点为X,X的父亲节点为Y(如果X的父亲节点存在),X的祖父节点为Z(如果X的祖父节点存在)。

(1)    单旋转

节点X的父节点Y是根节点。这时,如果X是Y的左孩子,我们进行一次右旋操作;如果X 是Y 的右孩子,则我们进行一次左旋操作。经过旋转,X成为二叉查找树T的根节点,调整结束。



(2)    一字型旋转

节点X 的父节点Y不是根节点,Y 的父节点为Z,且X与Y同时是各自父节点的左孩子或者同时是各自父节点的右孩子。这时,我们进行一次左左旋转操作或者右右旋转操作。

(3)    之字形旋转

节点X的父节点Y不是根节点,Y的父节点为Z,X与Y中一个是其父节点的左孩子而另一个是其父节点的右孩子。这时,我们进行一次左右旋转操作或者右左旋转操作。

3、伸展树区间操作

在实际应用中,伸展树的中序遍历即为我们维护的数列,这就引出一个问题,怎么在伸展树中表示某个区间?比如我们要提取区间[a,b],那么我们将a前面一个数对应的结点转到树根,将b 后面一个结点对应的结点转到树根的右边,那么根右边的左子树就对应了区间[a,b]。原因很简单,将a 前面一个数对应的结点转到树根后, a 及a 后面的数就在根的右子树上,然后又将b后面一个结点对应的结点转到树根的右边,那么[a,b]这个区间就是下图中B所示的子树。

利用区间操作我们可以实现线段树的一些功能,比如回答对区间的询问(最大值,最小值等)。具体可以这样实现,在每个结点记录关于以这个结点为根的子树的信息,然后询问时先提取区间,再直接读取子树的相关信息。还可以对区间进行整体修改,这也要用到与线段树类似的延迟标记技术,即对于每个结点,额外记录一个或多个标记,表示以这个结点为根的子树是否被进行了某种操作,并且这种操作影响其子结点的信息值,当进行旋转和其他一些操作时相应地将标记向下传递。

与线段树相比,伸展树功能更强大,它能解决以下两个线段树不能解决的问题:

(1) 在a后面插入一些数。方法是:首先利用要插入的数构造一棵伸展树,接着,将a 转到根,并将a 后面一个数对应的结点转到根结点的右边,最后将这棵新的子树挂到根右子结点的左子结点上。

(2)  删除区间[a,b]内的数。首先提取[a,b]区间,直接删除即可。


5、 应用

(1)     数列维护问题

题目:维护一个数列,支持以下几种操作:

1. 插入:在当前数列第posi 个数字后面插入tot 个数字;若在数列首位插入,则posi 为0。

2. 删除:从当前数列第posi 个数字开始连续删除tot 个数字。

3. 修改:从当前数列第posi 个数字开始连续tot 个数字统一修改为c 。

4. 翻转:取出从当前数列第posi 个数字开始的tot 个数字,翻转后放入原来的位置。

5. 求和:计算从当前数列第posi 个数字开始连续tot 个数字的和并输出。

6. 求和最大子序列:求出当前数列中和最大的一段子序列,并输出最大和。

(2)     轻量级web服务器lighttpd中用到数据结构splay tree.


例题:

[HNOI2002]营业额统计


[HNOI2002]营业额统计

Time Limit: 5 Sec   Memory Limit: 162 MB
Submit: 4128   Solved: 1305
[ Submit][ Status][ Discuss]

Description

营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。  输入输出要求

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数 ,表示第i天公司的营业额。

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

6
5
1
2
5
4
6

Sample Output

12

HINT

结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12


这题的数据本来有bug,少了一个数据,所有代码中用到了if(scanf("%d",&num)==EOF) num=0;
但是这题的bug改完了,所以直接scanf就行了,不过学习了一下有bug得数据的做法
#include<cstdio>
#include<iostream>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;
#define N 100005
#define inf 1<<29
int pre[N],key[N],ch[N][2],root,tot1;   //分别表示父结点,键值,左右孩子(0为左孩子,1为右孩子),根结点,结点数量
int n;
//新建一个结点
void newNode(int &r,int father,int k)
{
	r=++tot1;
	pre[r]=father;
	key[r]=k;
	ch[r][0]=ch[r][1]=0;      //左右孩子为空

}
//旋转,kind为1为右旋,kind为0为左旋
/*  
    这里一开始很难明白,感觉很乱,但是其实这里就是旋转的过程,画图就比较容易理解了
	kind一开始会有些乱,特别是kind即代表旋转方向又表示左右节点,放在一起很乱
	但这就是大牛的厉害之处吧,简洁,但是熟悉明白还需要一段时间 
*/ 
void Rotate(int x,int kind)
{
	int y=pre[x];
	//类似SBT,要把其中一个分支先给父节点
	ch[y][!kind]=ch[x][kind];
	pre[ch[x][kind]]=y;
	//如果父节点不是根结点,则要和父节点的父节点连接起来
	if(pre[y])
	   ch[pre[y]][ch[pre[y]][1]==y]=x;
	pre[x]=pre[y];
	ch[x][kind]=y;
	pre[y]=x;
}
//Splay调整,将根为r的子树调整为goal
void Splay(int r,int goal)
{
	while(pre[r]!=goal)
	{
		//父节点即是目标位置,goal为0表示,父节点就是根结点
		if(pre[pre[r]]==goal)
		    Rotate(r,ch[pre[r]][0]==r);
		else
		{
			int y=pre[r];
			int kind=ch[pre[y]][0]==y;
			//两个方向不同,则先左旋再右旋
			if(ch[y][kind]==r)
			{
				Rotate(r,!kind);
				Rotate(r,kind);
			}
			//两个方向相同,相同方向连续两次
			else
			{
				Rotate(y,kind);
				Rotate(r,kind);
			}
		}
	}
	//更新根结点
	if(goal==0) root=r;
}

int Insert(int k)
{
	int r=root;
	while(ch[r][key[r]<k])
	{
		//不重复插入,这里应该是相对于这道题来讲的吧,相同值无需再插入 
		if(key[r]==k){
			Splay(r,0);
			return 0;
		}
		r=ch[r][key[r]<k];
	}
	newNode(ch[r][key[r]<k],r,k);
	//将新插入的结点更新至根结点
	Splay(ch[r][key[r]<k],0);
	return 1;
}
//找前驱,即左子树的最右结点
int get_pre(int x)
{
	int tmp=ch[x][0];
	if(tmp==0) return inf;
	while(ch[tmp][1])
	    tmp=ch[tmp][1];
	return key[x]-key[tmp];
}
//找后继,即右子树的最左结点
int get_next(int x)
{
	int tmp=ch[x][1];
	if(tmp==0) return inf;
	while(ch[tmp][0])
	     tmp=ch[tmp][0];
	return key[tmp]-key[x];
}

int main(){

#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    while(~scanf("%d",&n))
    {
    	root=tot1=0;
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		int num;
    		//scanf("%d",&num);
    		//一开始数据有bug,所以这样写才能过,不过bug 改回来了 
			//把这里改成一般输入scanf("%d",&num)也可以过 
     		if(scanf("%d",&num)==EOF) num=0;   //读到文件结尾 
     		if(i==1)
     		{
     			ans+=num;
     			newNode(root,0,num);
     			continue;
			}
			if(Insert(num)==0) continue;
			int a=get_pre(root);
			int b=get_next(root);
			ans+=min(a,b);
		}
		printf("%d\n",ans);
	}
    
}


50、高级数据结构与实现:伸展树和红黑树详解 本博客详细解析了伸展树和红黑树这两种高级数据结构的原理、实现及性能特点。内容涵盖摊还分析在伸展树中的应用、自顶向下伸展树的插入与删除操作详解、红黑树的性质及其插入调整策略,并通过代码示例和流程图帮助读者深入理解。最后对伸展树和红黑树的适用场景进行了对比分析,旨在帮助开发者根据需求选择合适的数据结构。 阅读详情

相关推荐

伸展树:自适应数据结构的奥秘

本文深入探讨了伸展树这一自调整数据结构的摊还分析,展示了其如何通过每次操作后树的自平衡来保持操作效率。通过具体例子和数学证明,我们发现伸展树在一系列检索和插入操作中的总摊还成本被限定在O(log n)级别,即使在最坏情况下树可能高度不平衡。伸展树的这种特性使其成为处理动态数据集时的理想选择。

weixin_36289742的博客 288

伸展树的基本操作与应用 IOI2004 国家集训队论文 杨思雨

伸展树的基本操作与应用 安徽省芜湖一中 杨思雨 【关键字】 伸展树 基本操作 应用 【摘要】 本文主要介绍了伸展树的基本操作以及其在解题中的应用。全文可以分为以下四个部分。 第一部分引言,主要说明了二叉查找树在信息学竞赛中的重要地位,并且指出二叉查找树在某些情况下时间复杂度较高,进而引出了在时间复杂度上更为优秀的伸展树。 第二部分介绍了伸展树的基本操作。并给出了对伸展树时间复杂度

XiaoZheng的博客 1935

深入解析数据结构:B树与伸展树

本文深入探讨了B树的原理及其变体,包括B-Tree、B*-Tree、B′-Tree和B′′-Tree等,并对B+-Tree和B++-Tree等特殊类型的B树进行了介绍。同时,文章详细阐述了伸展树的概念、操作方法及其优势与劣势。通过对这些高级数据结构的解析,读者能够更好地理解它们在计算机科学中的应用以及如何在实际编程中加以运用。

weixin_42433737的博客 506

算法笔记——伸展树

伸展树

m0_67142204的博客 1435

数据结构之伸展树详解

1、 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Binary Sort Tree)能够支持多种动态集合操作,它可以用来表示有序集合、建立索引等,因而在实际应用中,二叉排序树是一种非常重要的数据结构。 从算法复杂度角度考虑,我们知道,作用于二叉查找树上的基本操作(如查找,插入等)的时间复杂度与树的高度成正比。对一个含n个节点的完全二叉树,这些操作的最坏情况运行时间为O(log n)。但如果因为频繁的删除和插入操作,导致树退化成一个n个节点的线性链(此时即为一个单链表),则这些操作的最坏情况运行时间为O(n)。为了克服以上缺点,很多二叉查找树的变形出现了,如红黑树、

论文、报告中那些乱七八糟的图(甘特图、卡吉图,桑基图,小提琴图,弦图,螺旋图,风玫瑰图)

在一些论文或报告中,总是会看到一些熟悉的图,但作者总是不能好好说话,非得搞个洋名字、缩写字或者半洋半中的词来显示它多么高大上,有时候这种故弄玄虚、华而不实的写法也实在是让人看了不伦不类,图首先是让读者更容易看懂的,不是让你来故作高深、玩玄学的。

David_jiang 9429

伸展树(splay tree)

对于二叉查找树而言,每次操作的最坏时间复杂度是O(N)。(当树退化为链表的时候)。为了解决这个问题,我们给树附加了一个平衡条件。平衡条件限制了任何节点的深度都不能过深。其中一种限制条件是:一颗二叉查找树的左子树和右子树的高度差不能超过1,这个条件限制产生了AVL树。 二叉查找树的最坏操作是O(N)。但是这样的操作并不常见。所以累加起来的时间就变得比单次操作时间的...

weixin_30611509的博客 703

解决Keil uVision许可证管理中Unknown Product错误

嵌入式开发中,IDE工具的许可证管理是确保开发环境正常运行的关键环节。Keil uVision作为ARM架构的主流开发工具,其许可证系统采用加密验证机制,通过产品版本识别实现授权控制。当出现Unknown Product错误时,通常源于版本兼容性问题或区域发行版差异,这直接影响开发工具链的可用性。特别是在维护历史项目或使用中国特供版时,开发者常会遇到此类问题。通过分析许可证类型、调整安装配置或建立虚拟化开发环境等工程实践方案,可以有效解决这类授权验证故障,保障嵌入式项目的持续集成与交付效率。

weixin_33743248的博客 363

伸展树-搜索树

/ 因为根节点被删除了,搜索会将右子树中节点值最接近查找数值的节点返回,这个节点就是右子树中最小的节点,然后右子树中最小节点必伸展至根,且(因无类同节点)其左子树必空。// 根节点 = 其右子树,也就是原本的根节点已经被删除了。在这种情况中,X有一个父节点P和祖父节点G(P的父节点)。// 令 新的根节点左子树 = 上面存储的左子树。存在,此时有一个隐含信息,因为搜索到了该节点,那么这个节点此时已经被伸展到树根了。关于查询操作中,将节点伸展至根节点的操作,应用伸展(splaying)技术。

lq 1316

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3118

Keil v5.11给STM32烧录程序记录

1)安装KeilMDK511 2)安装ST Link下载器驱动 3)打开Keil v5,加载工程文件 4)load pack(Keil.STM32F1xx_DFP.1.1.0和Keil.STM32F0xx_DFP.1.2.0) 5)编译程序- 0 Error(s), 0 Warning(s). 6)烧录程序 ...

守望的距离 6281

数据结构与算法分析之伸展树(splaytree)

1.伸展树,它保证从空树开始任意连续M次对树的操作最多花费O(MlogN)的时间。 2.伸展树的基本思想是,当一个节点a被访问后,通过一系列的AVL树的旋转将a移动到根节点上,这样下次访问时会被快速击中 只需要O(1)的时间。通常一个节点被访问时,它就很可能不久再次被访问。 3.构造伸展树的一个简单方法是从下向上进行单旋转,也就是将访问路径上的每个节点和他们的父节点都实施旋转

mu0206mu的专栏 6858

Verilog实战:手把手教你实现IEEE 754单精度浮点乘法器(附完整代码)

本文详细介绍了如何使用Verilog实现IEEE 754单精度浮点乘法器,包括标准解析、架构设计、Verilog代码实现及优化技巧。通过两级流水线设计,平衡性能与面积,适用于数字信号处理、AI加速器等高性能计算场景。

weixin_33724046的博客 315

数据结构之伸展树

1、 概述 二叉查找树(Binary Search Tree,也叫二叉排序树,即Binary Sort Tree)能够支持多种动态集合操作,它可以用来表示有序集合、建立索引等,因而在实际应用中,二叉排序树是一种非常重要的数据结构。 从算法复杂度角度考虑,我们知道,作用于二叉查找树上的基本操作(如查找,插入等)的时间复杂度与树的高度成正比。对一个含n个节点的完全二叉树,这些操作的...

baeryu4478的博客 92

DeepSeek掘金——用DeepSeek模型构建AI 代理

在本综合指南中,我们将探讨如何利用 DeepSeek 的功能构建能够以有意义的方式理解、推理和交互的复杂 AI 代理。人工智能领域正在迅速发展,DeepSeek 的模型代表了智能 AI 代理开发的重大进步。在本综合指南中,我们将探讨如何利用 DeepSeek 的功能构建能够以有意义的方式理解、推理和交互的复杂 AI 代理。

3861

2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!

(完整版内容:)1.汇集了本科各科的重点知识及多个机械名校800多个常见问题,共8.7万字185页,涵盖机械所以专业课的重点知识和常见问答。 2.涉及机械大类重点科目,包括:材料力学、控制工程、数控技术、机械制造技术基础、理论力学、液压传动、机械设计、机械原理、工程材料、互换性与技术测量、测试技术、汽车理论、程序设计与C语言等13门必修课。

weixin_56510835的博客 1862

【数据结构】【Splay伸展树】普通平衡树

【题目描述】 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的前驱(前驱定义为小于x,且最大的数) 求x的后继(后继定义为大于x,且最小的数) 【输入】 第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1...

weixin_44111457的博客 202

2025年华为杯中国研究生数学建模竞赛A题 通用神经网络处理器下的核内调度问题 思路+代码

针对通用神经网络处理器下的核内调度问题,我们提出了一套基于分层优化框架的系统性解决方案。该方案首先通过缓存敏感的启发式拓扑排序算法生成最小峰值缓存占用的调度序列,在满足计算图依赖关系的前提下优先选择能够释放或减少缓存占用的节点;随后采用最佳适应算法进行精细化的缓存分配,结合LRU换出策略动态管理多级缓存空间,最小化额外数据搬运量;最后引入多目标遗传算法进行联合优化,在严格控制数据搬运量不显著增加的前提下,通过关键路径分析、流水线并行和数据预取等技术进一步优化总执行时间。

YOLO 786

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

【0】README1) 本文部分内容转自 数据结构与算法分析,旨在理解 高级数据结构实现——自顶向下伸展树 的基础知识; 2) 源代码部分思想借鉴了数据结构与算法分析,有一点干货原创代码,for original source code, please visit https://github.com/pacosonTang/dataStructure-algorithmAnalysis/

PacosonSWJTU的博客 1794

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数据结构:AVL树与伸展树

核心思想:AVL Tree中每个节点都会有一个值,为depth(left)-depth(right),理想状态下为了维持平衡,这个值应当为-1,0,1。实际上LR旋转可以先通过RR(root->left)转化为LL形式,而后通过LL(root)旋转即可。如图,当插入2后,6的值为2(左深3右深1),所以要对6进行LL旋转。,也就是说伸展树可以保证整体的平均访问速度,但是不确保个体的访问速度。此时对G来说,导致它更深的是LR(左枝的右枝),所以要进行LR旋转。对称的,我们可以得到RL的旋转方法。

L0GoVC的博客 698

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【数据结构与算法】JAVA实现 自定向下的伸展树

文章目录JAVA实现自定向下的伸展树自定向下的伸展树的原理代码实现 JAVA实现自定向下的伸展树 主要是记录自己的内容,具体原理可能不够详细,代码可供参考。 自定向下的伸展树的原理 原理参考 书《数据结构与算法分析:JAVA语言描述》P356 和 自定向下的伸展树的原理 代码实现 package chapter12; import chapter04.MyCustomException; public class SplayTree<T extends Comparable<? super

大枫树 380

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构:伸展树Splay

核心思想:局部性原理 刚刚被访问过的元素,极有可能在不久之后被再次访问 即将被访问的元素,极可能处于刚被访问元素的附近 伸展树将每次刚被访问的结点通过旋转操作移到树根 采用双层伸展...

xipitu的博客 239

【Golang 数据结构与法算】 Splay 伸展树

GitHub完整代码 代码实现 // Package tree 伸展树:基于局部性原理,将被访问的数据亦步亦趋的伸展至根节点,并在伸展过程中对树进行折叠(降低树高,双层伸展) package tree import ( "data-structures-and-algorithms/contract" ) // Splay 伸展树 type Splay struct { Bst } // NewSplay 新建空伸展树 func NewSplay(cmps ...contract.Compar.

qq_37981903的博客 564
上一篇: 数据结构----主席树
下一篇: 数据结构----树状数组
BIGKAKA
博客等级 码龄11年 32粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值