首页 > 其他分享 >平衡树

平衡树

时间:2023-12-08 21:15:26浏览次数:26  
标签:son int siz 二叉 平衡 now 节点

平衡树

平衡树有好多种,边学边写吧~。

目录

序号 类型
1 Treap
2 Splay
3 FHQ Treap
4 红黑树
5 替罪羊树
6 Link Cut Tree

前置芝士

二叉搜索树 BST

简介

二叉搜索树是一种二叉树的树形数据结构,其定义如下:

  1. 空树是二叉搜索树。
  2. 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。
  3. 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。
  4. 二叉搜索树的左右子树均为二叉搜索树。

操作

二叉搜索树支持 6 个基本操作:

  • 插入
  • 删除
  • 按排名查值
  • 按值查排名
  • 查前驱(小于它的最大值)
  • 查后继(大于它的最小值)

建树

没有什么复杂的操作,但是为了防止宇宙射线导致的越界,可以插入两个值为 $inf$ 和 $-inf$ 的节点。

插入

插入一个值 v,从根节点开始向下递归。

设现在所在节点为 now,分许多情况:

  1. 如果 now 为空,则在当前位置新建一个值为 v 的节点,并将 cnt 设为 1。
  2. 如果 $val_{now} == v$,那么将当前位置的 cnt 加一即可。
  3. 如果 $val_{now} > v$,递归 now 的左子树。
  4. 如果 $val_{now} < v$,递归 now 的右子树。

删除

参考

Treap

思想

Treap 实际是对于 BST 的一种实现方式,通过给予每个节点一个随机的优先级来保证其深度不过深,从而保证复杂度。

struct Treap {
	int rt, val[N], key[N], siz[N], son[N][2];
	ll sum[N];
	bool rev[N];
	
	inline void pushUp(const int& u) {
		sum[u] = sum[son[u][0]] + sum[son[u][1]] + val[u];
		siz[u] = siz[son[u][0]] + siz[son[u][1]] + 1;
	}
	inline void pushRev(const int& u) {
		if (u == 0) { return; }
		rev[u] ^= 1; std::swap(son[u][0], son[u][1]);
	}
	inline void pushDown(const int& u) {
		if (rev[u]) {
			pushRev(son[u][0]); pushRev(son[u][1]);
			rev[u] = false;
		}
	}
	
	void split(int u, int k, int& l, int& r) {
		if (u == 0) { l = r = 0; return; }
		pushDown(u);
		if (siz[son[u][0]] < k) {
			l = u; split(son[u][1], k - siz[son[u][0]] - 1, son[u][1], r);
		} else {
			r = u; split(son[u][0], k, l, son[u][0]);
		}
		pushUp(u);
	}
	int merge(int l, int r) {
		if (l == 0 || r == 0) { return l | r; }
		pushDown(l); pushDown(r);
		if (key[l] < key[r]) {
			son[l][1] = merge(son[l][1], r); pushUp(l); return l;
		} else {
			son[r][0] = merge(l, son[r][0]); pushUp(r); return r;
		}
	}
} tr;

标签:son,int,siz,二叉,平衡,now,节点
From: https://www.cnblogs.com/Assassins-Creed/p/17889015.html

相关文章

  • 多开工具对游戏平衡性与公平性的影响评估
    多开工具对游戏平衡性与公平性的影响评估摘要:随着网络游戏的普及,一些玩家开始使用多开工具来同时运行多个游戏账号。然而,这种行为引发了一系列讨论,涉及到游戏的平衡性和公平性问题。本文将评估多开工具对游戏平衡性与公平性的影响,并提出相应的观点。引言:多开工具是一种允许玩......
  • 全局平衡二叉树学习笔记 && [SDOI2017]切树游戏解题报告
    首先,任何一个卡树剖的出题人都很没有素质前言2023年8月22日,XDFnoip模拟赛场上,神犇liuhangxin自己发明了矩阵乘法维护FWT,可是出成绩的时候发现本题挂了30分。2023年9月22日,菜鸡cool_milo看到了liuhangxin的题解,但是由于太菜,并没有看懂。2023年10月22日,菜......
  • 第7章. 平衡二叉搜索树
    平衡二叉搜索树(BalancedBinarySearchTree)1.1二叉搜索树存在的问题添加、删除节点时,都可能导致二叉搜索树退化成链表。为了防止二叉搜索树退化成链表,让添加、删除搜索的复杂度维持在O(logn),提出平衡的概念。1.2平衡(Balance)平衡:当节点数量固定时,左右子树的高度越......
  • 16_平衡二叉树
    平衡二叉树【题外话】二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。(从上往下看)二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。(从下往上看)小疑惑:为什么104.二叉树的最大深度中求的是二叉树的最大深度,也用的是后序遍历。(本质上求解的就是根节......
  • 不平衡少样本数据集的算法方案
    在图像实际的细分场景中,经常会遇到数据集不均衡以及数据集数量有限等问题,如何有效利用数据集,提升自己的算法效果,这里大刀基于自己的实际项目经验,分享在实际图像分类领域遇到问题,以及解决的方案,供参考。前言大家好,我是张大刀。之前有个智慧工地的项目,其中一个需求是监控工地......
  • PID小车平衡和跳跃的核心代码
    PID小车平衡和跳跃的核心代码主要包括以下几个部分:初始化PID控制器参数,包括比例系数Kp、积分系数Ki和微分系数Kd。读取传感器数据,如陀螺仪、加速度计等,用于计算小车的旋转角度和速度。根据传感器数据计算PID控制器的输出,即控制信号。将控制信号转换为电机驱动信号,控制小车的转向和......
  • 基于FPGA的图像白平衡算法实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览    2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述       FPGA(Field-ProgrammableGateArray)是一种可编程逻辑电路,可以通过编程实现各种算法,包括图像白平衡算法。图像白平衡算法是一种用于调整图像颜色温度的方法,......
  • 1027. 最优账单平衡(待完善)-dfs
    题目描述一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计10美元。如果小明同学支付了小爱同学的出租车钱共计5美元。我们可以用一个三元组(x,y,z)表示一次交易,表示x借给y共计z美元。用0,1,2表示小爱同学、小新同学和小明同学(0,1,2为......
  • 查找 - 二叉排序树/平衡二叉树
    二叉排序树性质:中序遍历是递增的查找算法实现BSTreeSearchBST(BSTreeT,KeyTypekey){if(!T||key==T->data)returnT;elseif(key<T->data)returnSearchBST(T->lchild,key);elsereturnSearchBST(T->rchild,key);}算法分析最坏情况:单支树A......
  • 优化系统性能:同步与异步操作的巧妙平衡
     在今天的数字化环境中,优化系统性能是任何技术团队不可忽视的重要任务。在这一过程中,合理地利用同步和异步操作扮演着至关重要的角色,直接影响着系统的响应速度、资源利用率以及用户体验。同步操作:简单直观但潜藏风险同步操作按照顺序执行,其优点在于逻辑清晰、易于理解......