【数据结构】Treap——方便的平衡树

11.2.2 蓝桥杯树形数据结构之平衡树FHQ—Treap(无旋Treap) 无旋Treap是Treap(树堆)数据结构的一个变种,结合了二叉搜索树和堆的特性。与传统的Treap通过旋转操作保持平衡不同,无旋Treap通过分裂(Split)和合并(Merge)操作维护树的平衡,避免了复杂的旋转逻辑,从而得名“无旋”。无旋Treap结合了二叉搜索树和堆的优点,通过分裂和合并操作维持平衡,既简化了实现又保持了高效的性能。在蓝桥杯等算法竞赛中,掌握无旋Treap能够帮助参赛者高效解决一系列动态数据集合的问题,是学习数据结构和算法的重要内容。 阅读详情

前言

顾名思义,treap就是tree+Heap,复杂度与Splay的均摊logloglog不同,treap是期望logloglog,但与Splay比起来,功能都差不多,但代码的长度和调试难度都比Spaly要舒服很多,

简介

treap是一棵二叉查找树,与普通的二叉查找树不同,对于每个节点,它还记录一个随机值rdrdrd,满足,如果只看rdrdrd的话,它就是一个堆,
这样,它的期望深度就是logloglog的,每次的查询修改直接在上面跑也没问题。

以下为treap的基本操作,各种在这上面扩展出的其他的操作这里就不细讲了

Build

我们可以发现一棵treap同时也是一棵迪笛卡尔树,
那么建树就可以O(n)解决了,用一个栈即可,
(当然你像插入一样做也没问题)

//b[i].rd为位置i的随机值
//merge()为标记的合并,
void build(int q)
{
	if(b[q].l)build(b[q].l);
	if(b[q].r)build(b[q].r);
	merge(q);
}
void build_treap()
{
	int la,w;
	n++;b[n].rd=2e9;
	fo(i,1,n)
	{
		int la=0;
		for(;za[0]&&b[za[za[0]]].rd<b[i].rd;za[0]--)
		{
			la=w=za[za[0]];
			if(za[0]-1)b[w].fa=za[za[0]-1],b[za[za[0]-1]].r=w;
		}
		if(i>n)break;
		b[i].l=la;
		b[la].fa=i;
		za[++za[0]]=i;
	}
	root=n;
	build(root);
}

Split

treap当然离不开Split操作啦,
这个点操作的作用是把treap两棵treap,一半为前si个,另一半就是剩下的,
具体的操作是:判断断开的位置是在左子树还是右子树,再递归求解,
(看标的话理解的会快一点)

//merge()为标记的合并,

typedef pair<int,int> TRP;

TRP split(int q,int si)
{
	if(!si)return TRP(0,q);
	TRP t;
	if(si<=b[b[q].l].si)
	{
		t=split(b[q].l,si);
		b[q].l=t.second;
		t.second=q;
	}else
	{
		t=split(b[q].r,si-1-b[b[q].l].si);
		b[q].r=t.first;
		t.first=q;
	}
	merge(q);
	return t;
}

Merge

合并就简单了,直接把较大的那个放到这个位置即可

//因为merge函数被标记合并占用了,所以只能用另一个词了

int amalgamate(int q,int w)
{
	if(!q||!w)return q+w;
	if(b[q].rd>b[w].rd)
	{
		b[q].r=amalgamate(b[q].r,w);
		merge(q);
		return q;
	}
	b[w].l=amalgamate(q,b[w].l);
	merge(w);
	return w;
}
范浩强_wc2012谈谈各种数据结构 ……看之前要先orz一下…… 大概他是可持久化编程的提出者? 立即下载

相关推荐

基本Treap.ppt

基本Treap.ppt

数据结构-树堆(Treap)

现在给你一个问题,每次右两种操作,第一种操作是向集合中添加一个数x,第二种操作是询问集合中不大于k的最大的数是多少。现在我们不用任何stl里面的容器的情况下,你要怎样解决这个问题呢?一个最暴力的方法是,从一个数组存数,然后每次询问去遍历这个数组,这样每次插入数的时间复杂度是O(1),而查询时间复杂是O(n),所以这种方法对于查询操作比较多时,会很慢.有基础的同学可能会想到用二分去找,但是用二分必须...

creatorx的博客 606

数据中心——Vxlan基本概念1

东西流量指的就是横向流量-------例如:服务器与服务器之间交换流量南北流量指的就是纵向流量-------例如:客户端和服务器之间的流量以下主要是讲解业务平面的网络架构(一般业务平面就需要用到专用的数据中心交换机)

m0_49864110的博客 1万+

treap初步,建树,更新,旋转,插入,删除操作

//建树 struct data{ int l,r,v,size,rnd,w; }tr[100005]; int n,size,root,ans; void update(int k){ tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; } 单旋 void rturn(int &k){ int t=tr[k]...

qq_36172410的博客 615

2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--下篇

我们可以看到,目前配置基本完成了,现在有两个错,一个是Chrome没安装,这个自己安装就可以了,如果不需要WEB测试也不影响开发,另一个是Simulator还没安装,这个主要是安装的时间太长了,也就是上面的这一步。这里要注意,这个下载安装会比较慢,有的载会特别卡造成安装失败,最好的办法是挂一个VPN,保证安装完成,不过这个可以在以后单独进行安装。至此,基本的安装完毕,好多人会以为Xcode就OK了,其实还没有,我们还缺少命令行工具包,这个在安装完Flutter以后进行设置。

weixin_48803304的博客 1412

深入解析TI C2000 ePWM模块:峰值电流模式Buck与LLC谐振变换器实战配置

脉宽调制(PWM)技术是电力电子与数字电源控制的核心,它通过调节开关信号的占空比或频率,实现对功率变换器输出电压、电流的精确控制。其基本原理是利用微控制器内部的定时器和比较器,生成具有特定时序的方波信号,驱动功率开关器件。这项技术的核心价值在于将复杂的模拟控制环路数字化,从而提升系统的可控性、灵活性和可靠性。在电机驱动、不间断电源(UPS)、服务器电源和新能源逆变器等广泛应用场景中,PWM技术都是实现高效能量转换的基石。本文聚焦于德州仪器(TI)C2000系列微控制器中功能强大的增强型PWM(ePWM)模块

weixin_30410119的博客 344

【图解Treap——平衡树】

Treap-平衡树的讲解纯个人理解

coder-yhh的博客 877

MIC(Maximal Information Coefficient)最大互信息系数

MIC(Maximal Information Coefficient)最大互信息系数是一种用于衡量两个变量之间相关性的统计量。它扩展了传统的互信息(MI)和条件互信息(CMI)的概念,具有更广泛的应用范围。MIC能够捕获包括功能性和非功能性的广泛的关联,具有普遍性和公平性。普遍性意味着在足够的样本量下,MIC能够捕捉到广泛的相关关系,而不仅仅局限于特定的功能类型;公平性则意味着MIC对不同类型的包含同等噪声的关系给出了相似的分数。需要注意的是,虽然MIC具有很多优点,但它也有一些局限性。

qlkaicx的博客 4605

数据结构之平衡树(Treap)

平衡树是二叉搜索树和堆合并构成的新数据结构,所以它的名字取了Tree和Heap各一半,叫做Treap。 堆和树的性质是冲突的,二叉搜索树满足左子树<根节点<右子树,而堆是满足根节点小于等于(或大于等于)左右儿子。因此在Treap的数据结构中,并不是以单一的键值作为节点的数据域。Treap每个节点的数据域包含2个值,key和weight。 key值,和原来的二叉搜索树一样,满足左子树<根节点<右子

long-long-ago 2万+

手把手教你学Simulink--双足机器人分数阶PID控制仿真

分数阶PID(Fractional-order PID, FOPID)控制是一种先进的控制策略,它扩展了传统的整数阶PID控制器的概念。FOPID控制器允许积分和微分项的阶次不是严格的整数,而是可以是任意实数,这为系统提供了更多的设计自由度,并可能带来更好的性能。在双足机器人控制中,分数阶PID控制可以用于改善机器人的平衡控制、轨迹跟踪等任务的性能。下面我们将详细介绍如何使用Simulink进行基于分数阶PID控制方法的双足机器人仿真研究。

MHD0815的博客 880

CSI Tools 工具的安装 Intel 5300 + Ubuntu14.04

在 ubuntu14 系统上面安装 CSI Tools,2020最新教程,亲测可用,只要保证和我做法一致绝对可以安装好。

WS的小屋 1万+

【数据结构】图文详解Treap平衡树

一、前言 FHQ平衡树是一种树形数据结构,它是对二叉查找树的一种优化方式,但是学习的过程是真的非常的…痛苦。 二、二叉查找树的概念 首先,我们称具有以下3个性质的树为二叉查找树(BST) 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 如图 在这张图中我们可以发现,在二叉查找树中,从根结点开始查找一个点的时间复杂度为logn级别,在我们想对树进行插入查找的时候都非常方便。 但是很遗憾,二叉查找树是有着它的缺陷的

qq_49688477的博客 2122

多无人车协同探索开源包部署教程及常见报错解决方式

本博客将介绍项目的基本概念、部署步骤以及常见问题的解决方案。该项目利用 RRT(Rapidly-exploring Random Tree)算法,通过多机器人协作进行高效的环境探索,适用于自动化与自主导航任务。项目简介:介绍该项目的核心算法、特点及应用场景,展示如何通过多个机器人共同工作来提升探索效率。部署教程:详细讲解如何在 ROS Noetic 环境中部署该项目,安装依赖、创建工作空间、克隆代码并编译项目。项目运行:包括单机器人与多机器人自主探索的示例,帮助读者快速理解和实践项目。

慕羽★的博客 1764

【数据结构】【平衡树】无旋转treap

最近在研究平衡树,看起来这种东西又丧水又很深,感觉很难搞清楚。在Ditoly学长的建议下,我先学习了正常的treap,个人感觉这应该是平衡树当中比较好懂的而且比较好写的一种。 然而,发现带旋treap有很多无法支持的操作,例如各种区间操作,而且由于会旋转无法可持久化,这是一个十分影响实用性的问题,在没有办法支持区间操作的情况下,我有2种选择: 1)滚去学splay;2)学习无旋tre...

b528960962901586的博客 176

Istio ICA考试之路---2-2

找到dr部分,这部分可以在mirroring里找也可以和题2-1一样在Traffic Management的dr里复制,内容都一样。此题之后都是在cluster-2上操作,所以就不需要再切换了.之后的几题2.1节就忽略掉了。可以看到,80%的流量被镜像到了dev上,实际考试这步可以忽略。看到ex-ip是192.168.126.220。获取gw,把gateways加入到vs配置中。获取istio-ingress的ex-ip。就获得了这样一个模板文件。查看2个pod的日志。

Q先生 854

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【数据结构】平衡树 - treap

treap = tree + heap 树堆(treap:让BST尽量随机) 动态维护一个有序序列 对于一个大根堆: 最大值:一直往右走 最小值:一直往左走 treap实现操作 set实现 ①插入 insert ②删除(使其变成叶子节点) erase ③找前驱(中序遍历的前一个位置)/后继(中序遍历的后一个位置) lower_bound ④找最大/最小 begin(),end(); ⑤求某个值的排名 无 ⑥求排名是k的数是谁 无 ⑦比某个数小的最大值 ( 这个数可以不

繁凡さん的博客 689

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++数据结构 —— 平衡树Treap

介绍并实现了平衡树Treap

m0_46329175的博客 1140

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【数据结构】范浩强Treap(非旋转平衡树)&可持久化Treap总结

范浩强Treap 这是一种很神奇的数据结构(似乎我每个数据结构都要这么说) 尽管可能是我的模板太丑了,速度实测出来似乎并不比splay快,不过要做到可持久化的话, 这种数据结构就是首选。 另外,这种数据结构相当好写。 简单地说,这种treap基于两种操作: Merge(int x,int y)-&gt;将x的子树和y的子树合并起来,且满足 x的子树的最大值小于等于y子树的...

氧化钠的博客 3765

数据结构 平衡树treap

最近闲来无事,就研究了下平衡树,写了个treap,最后搞出了数组模拟的版本,(宝宝真的不喜欢指针),大概就是这样子,写篇博客记录一下。 我们考虑一颗搜索二叉树,如果 int s[siz][2], v[siz], pri[siz], tot, root; int cmp(int a, int b) { if(v[a] == b) return -1; return v[a] <

Gqe 521

【数据结构】【平衡树】浅析树堆Treap

【Treap】 【Treap浅析】   Treap作为二叉排序树处理算法之一,首先得清楚二叉排序树是什么。对于一棵树的任意一节点,若该节点的左子树的所有节点的关键字都小于该节点的关键字,且该节点的右子树的所有节点的关键字都大于该节点的关键字,则这棵树是一棵二叉排序树。   Treap在每一个节点中有两个最关键的元素——weight和value。   value是在创建这个新节点时...

XIAO01067922的博客 393

数据结构 平衡树 Treap讲解

累加器传送门:http://blog.youkuaiyun.com/NOIAu/article/details/71775000以前经常听着lmy大佬说平衡树怎么怎么样,问到一道题怎么做的时候(手写个平衡树就好了啊),觉得好厉害,终于自己学了最简单的平衡树——Treap首先,Treap,顾名思义就是Tree和heap的结合,也就是具有堆性质的二叉搜索树,好了,想必讲到这里,大家已经完全明白了Treap的原理和实

Monica 730

平衡树之Treap(树堆)——杨子曰数据结构

平衡树之Treap(树堆)——杨子曰数据结构 来道题(Tyvj 1728 / HYSBZ - 3224): 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的前驱(前驱定义为小于x,且最大的数) 求x的后继(后继定义为大于x,且最小的数)...

杨子曰:代码是神奇的 460

【数据结构】【平衡树】Treap

百度百科 Pre_knowledge     二叉排序树     二叉排序树是一棵二叉树。每个节点对应一个权值v,对于每个节点,一定满足如下性质:         二叉排序树的每个节点的左子树要么为空,要么左子树的任意节点的权值v'一定小于v。         二叉排序树的每个节点的有子树要么为空,要么右子树的任意节点的权值v'一定大于v。     二叉排序树的节点:每个节点维护如下信...

weixin_34346099的博客 166

平衡树之Treap—强大的数据结构

Treap介绍 Treap,是平衡树的分支之一,故也支持旋转操作,在数据结构中也称树堆,之所以叫树堆,是因为Treap=Tree(树)+Heap(堆)。其基本操作的期望时间复杂度为O(log n)。相对于其他的平衡二叉搜索树,Treap的特点是实现简单,且能基本实现随机平衡的结构。 正题 Treap是一棵二叉排序树,它的左子树和右子树分别是一个Treap,和一般的二叉排序树不同的是,Trea

XianHaoMing的博客 1266
上一篇: 【JZOJ 5424】【NOIP2017提高A组集训10.25】凤凰院凶真
下一篇: 【JZOJ 5425】【NOIP2017提高A组集训10.25】数论
HOWARLI
博客等级 码龄11年 109粉丝 378原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值