SBT(size balanced tree) 和AVL 合二为一

竞赛最好用的平衡树-Size Balanced Tree(SBT)【建议收藏】 大家好。 前段时间我更新过AVL、红黑树以及搜索二叉树的简单讲解。今天我们还是围绕着平衡树的话题,来讲解一个很牛逼的平衡树结构。这种结构是我国的一位大牛:陈启峰。在2006年,他还在读高中阶段,所发明的一种平衡树结构,叫Size Balanced Tree(SBT),根据节点的个数,来调整平衡性。一直到今天,这种平衡树结构,在算法竞赛领域是非常常用的,虽然SBT的时间复杂度跟AVL、红黑树这些平衡树一样,但是SBT是比较好写,比较好改的。所以在算法竞赛时,是最常用的一种算法。陈启峰SBT论文(译) 本期文章 阅读详情

SBT 和AVL类似,只是是基于size 进行balance的,旋转的case是一样的。

public class AVLOrSBTTreeMap<Key extends Comparable<Key>, Value> {
	public enum BF {HEIGHT, SIZE, NONE}; //balance factor
	private BF bf = BF.HEIGHT; 
	public AVLOrSBTTreeMap() { }
	public AVLOrSBTTreeMap(BF balanceFactor) {this.bf = balanceFactor;}
	private class Node {
		Key key;
		Value value;
		Node left, right;
		int ht, sz;
		Node(Key k, Value v) {
			this.key = k;
			this.value = v;
			this.ht = 1;
			this.sz = 1;
		}
	}
	private Node root;
	private int height(Node root) {
		if (root == null) return 0;
		return root.ht;
	}
	
	private int size(Node root) {
		if (root == null) return 0;
		return root.sz;
	}
	private void updateHeightAndSize(Node root) {
		root.sz = size(root.left) + size(root.right) + 1;
		root.ht = Math.max(height(root.left), height(root.right)) + 1;
	}
	
	private Node rotateRight(Node root) {
		Node l = root.left;
		root.left = l.right;
		updateHeightAndSize(root);
		l.right = root;
		updateHeightAndSize(l);
		return l;
	}
	
	private Node rotateLeft(Node root) {
		Node r = root.right;
		root.right = r.left;
		updateHeightAndSize(root);
		r.left = root;
		updateHeightAndSize(r);
		return r;
	}
	private int heightDiff(Node root) {
		return height(root.left) - height(root.right);
	}
	private Node maintain(Node root) {		
		if (bf == BF.HEIGHT && heightDiff(root) > 1 && heightDiff(root.left) >= 0 ||
			bf == BF.SIZE && root.left != null && size(root.left.left) > size(root.right))
		{	// LL
			root = rotateRight(root);
		}
		else if (bf == BF.HEIGHT && heightDiff(root) > 1 && heightDiff(root.left) < 0 ||
			bf == BF.SIZE && root.left != null && size(root.left.right) > size(root.right)) 
		{	// LR
			root.left = rotateLeft(root.left);
			root = rotateRight(root);
		}
		else if (bf == BF.HEIGHT && heightDiff(root) < -1 && heightDiff(root.right) <= 0 ||
			bf == BF.SIZE && root.right != null && size(root.right.right) > size(root.left))
		{	// RR
			root = rotateLeft(root);
		}
		else if (bf == BF.HEIGHT && heightDiff(root) < -1 && heightDiff(root.right) > 0 ||
			bf == BF.SIZE && root.right != null && size(root.right.left) > size(root.left))
		{	//RL
			root.right = rotateRight(root.right);
			root = rotateLeft(root);
		}
		updateHeightAndSize(root);
		return root;
	}
	private Node put(Node root, Key key, Value value) {
		if (root == null) return new Node(key, value);
		if (key.compareTo(root.key) < 0) root.left = put(root.left, key, value);
		else if (key.compareTo(root.key) > 0) root.right = put(root.right, key, value);
		else root.value = value;
		return maintain(root);
	}
	public void put(Key key, Value value) {
		root = put(root, key, value);
	}
	
	private Node min(Node root) {
		if (root.left == null) return root;
		return min(root.left);
	}
	private Node remove(Node root, Key key) {
		if (root == null) return null;
		if (key.compareTo(root.key) < 0) {
			root.left = remove(root.left, key);
		}
		else if (key.compareTo(root.key) > 0) {
			root.right = remove(root.right, key);
		}
		else {
			if (root.left == null) return root.right;
			else if (root.right == null) return  root.left;
			else {
				Node successor = min(root.right);
				Key tempKey = root.key;
				root.key = successor.key;
				root.value = successor.value;
				successor.key = tempKey;
				root.right = remove(root.right, tempKey);			
			}
		}
		return maintain(root);
	}
	public void remove(Key key) {
		root = remove(root, key);
	}
	private int rank(Node root, Key key) {
		if (root == null) return 0;
		if (key.compareTo(root.key) == 0) return size(root.left);
		if (key.compareTo(root.key) < 0) return rank(root.left, key);
		return size(root.left) + 1 + rank(root.right, key);
	}
	public int rank(Key key) {
		return rank(root, key);
	}
	private Node select(Node root, int rank) {
		if (root == null) return null;
		if (rank == size(root.left)) return root;
		if (rank < size(root.left)) return select(root.left, rank);
		return select(root.right, rank - size(root.left) - 1);
	}
	public Key select(int rank) {
		Node x = select(root, rank);
		if (x == null) return null;
		return x.key;
	}
	private Node floor(Node root, Key key) {
		if (root == null) return null;
		int cmp = key.compareTo(root.key);
		if (cmp == 0) return root;
		if (cmp < 0) return floor(root.left, key);
		Node f = floor(root.right, key);
		if (f == null) return root;
		return f;
	}
	public Key floor(Key key) {
		Node f = floor(root, key);
		if (f == null) return null;
		return f.key;
	}
	private Node ceiling(Node root, Key key) {
		if (root == null) return null;
		int cmp = key.compareTo(root.key);
		if (cmp == 0) return root;
		if (cmp > 0)  return ceiling(root.right, key);
		Node ceil = ceiling(root.left, key);
		if (ceil == null) return root;
		return ceil;
	}
	public Key ceiling(Key key) {
		Node x = ceiling(root, key);
		if (x == null) return null;
		return x.key;
	}
	private Value get(Node root, Key key) {
		if (root == null) return null;
		int cmp = key.compareTo(root.key);
		if (cmp == 0) return root.value;
		if (cmp < 0) return get(root.left, key);
		return get(root.right, key);
		
	}
	public Value get(Key key) { return get(root, key);}
	
	private Node copy(Node root) {
		if (root == null) return null;
		Node x = new Node(root.key, root.value);
		x.ht = root.ht;
		x.sz = root.sz;
		x.left = copy(root.left);
		x.right = copy(root.right);
		return x;
	}
	
	public AVLOrSBTTreeMap<Key, Value> copy() {
		AVLOrSBTTreeMap<Key, Value> clone = new AVLOrSBTTreeMap<Key, Value>();
		clone.root = copy(this.root);
		return clone;
	}


size balanced tree (平衡二叉树) ----- 傻X树----陈启峰论文 Size Balanced Tree(SBT)是一种平衡二叉查找树。它的论文由中国广东中山纪念中学的陈启峰于2006年底完成,并在Winter Camp 2007中发表。由于SBT的拼写很容易找到中文谐音,它常被中国的OIer们戏称为“傻X树”、“Super BT”等。但它的性能并不SB,编写起来也并不BT。恰恰相反,SBT易于实现,且据陈启峰论文中所言,“这是目前为止速度最快的高级二叉搜 阅读详情

相关推荐

节点大小平衡树((Size Balanced Tree, c++和python源码)

我自己写的SBTree的实现 参考了http://www.nocow.cn/index.php/Size_Balanced_Tree的算法 声明:此源码可以用于商业用途,但请注明来源于random

有序表之SB树(Size Balanced Tree)

1、SB树的失衡类型及失衡的调整方式 2、SB树的代码实现

明朗晨光的专栏 1770

SBT和AVL的C++模板实现 最新版

SBT和AVL的C++模板实现,提供了与stl中的set类似接口,支持迭代器,并提供了set所不支持的动态顺序统计功能,内含参考手册。

SizeBalancedTrees

前言 BST一直都是卡常的领域,为了不被卡常,我们需要一个更平衡的BST,SizeBalanceTree就是不错的选择。 旋转 众所周知,平衡树分为两类,非旋平衡树和旋转平衡树, SizeBalanceTree是依靠旋转来保持平衡的。 左旋 左旋的意思就是把当前节点移到左边去,同时保持树的中序遍历不变,右旋也是同理(代码与左旋对称),注意保持树的中序遍历不变是非常重要的,它决定了树的搜索性质是否变化; 右旋 代码 inline void Rotate(int &now,bool flag) {

Darkside的博客 325

SBT和AVL的C++模板实现

SBT和AVL的C++模板实现,提供了与stl中的set类似接口,支持迭代器,并提供了set所不支持的动态顺序统计功能,内含参考手册。

陈启峰《Size Balanced Tree》 pdf英文版

“Size Balanced Tree (abbr. SBT) 是一种通过大小来保持平衡的BST。” SBT资料——陈启峰本人 pdf英文版 若需参考更多资料,请下载“陈启峰《Size Balanced Tree》 ppt中文版”

SizeBalanceTree详解(含代码实现)

+1.SBT树的概念及其相关性质 Size Balanced Tree(SBT)是一种平衡二叉查找树。它的论文由中国广东中山记念中学的陈启峰于2006年末完成,php 并在Winter Camp 2007中发表。因为SBT的拼写很容易找到中文谐音, 它常被中国的Oler们戏称为 “傻X树”、html “Super BT”等。但它的性能并不SB,编写起来也并不BT。偏偏相反,SBT易于实现,且据陈启峰论文中所言 ,node “这是目前为止速度最快的高级二叉搜索树”。它能在O(logn)的时间..

qq_56999918的博客 2027

陈启峰《Size Balanced Tree》 ppt中文版

“Size Balanced Tree (abbr. SBT) 是一种通过大小来保持平衡的BST。” SBT资料——陈启峰本人 ppt中文版 若需参考更多资料,请下载“陈启峰《Size Balanced Tree》 pdf英文版”

Size Balanced Tree

SBT是一种平衡二叉树结构,它与AVL的不同在于它的自平衡条件是结点的size大于等于其侄子结点的size。SBT的旋转操作与AVL类似,但是有一种较为简便的maintain方法。 由于在结点类中包含了结点的size(它所在的子树的结点个数),我们可以轻易地求得结点数据从小到大的rank并找到第k小的结点。 具体代码如下: 1 //SBTree 2 #include ...

dongchuan5097的博客 170

SystemVerilog实战:AXI Stream协议从零搭建(附完整代码解析)

本文详细介绍了如何使用SystemVerilog从零搭建AXI Stream协议,包括核心信号解析、接口设计、主从设备实现及验证环境构建。通过完整的代码示例和工程实践技巧,帮助开发者掌握AXI Stream在FPGA/ASIC设计中的高效数据传输方法,特别适合视频处理和网络数据传输等应用场景。

weixin_29207439的博客 360

先进半导体材料与器件Chapter3

Chapter3 异质结双极晶体管(HBT) 作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 知乎:https:/...

一个会写代码的烤鸭 5803

SBT(Size Balanced Tree)2016.9.6

参考:陈启峰《Size Balanced Tree》 一、定义 节点大小平衡树( Size Balanced Tree,缩写:SBT)是一种自平衡二叉查找树 它是由中国广东中山纪念中学的陈启峰发明的 陈启峰于 2006 年底完成论文《Size Balanced Tree》,并在 2007 年的全国青少年信息学奥林匹克竞赛冬令营中发表 由于 SBT 的拼写很容易找到中文谐音,它常被中国

追风蹑影 1115

【客户案例】母婴行业头部品牌是如何做私域的

各品牌争相跑马圈地,想方设法圈住流量,建立品牌资产;私域运营是一项“重人力”的工作,在传统的品牌运营过程中,私域操盘手经常会由于一对多导致无法兼顾,只能通过提高触达次数的方式加大漏斗,这样难以让每个社群都发挥出应有的价值,甚至还会导致一定程度的用户流失。除了宝妈身份外激发的用户认同感、亲密度外,KOC们作为产品的使用者,自由选择的推品和自由创作的推广文案都更具有真实性、代表性,能够极大程度激发群友们的信任感,从而愿意为产品买单,转化复购水到渠成。不同阶段的宝妈,母婴知识的储存量和经验是不同的,K品牌还会。.

圈量SCRM系统-企微营销工具-私域流量运营软件 948

Sized Balanced Tree探索(模板)

首先膜拜发明人陈启峰大牛,orz……现在人家可是stanford的PhD……         众所周知,平衡树有很多种,什么Splay、Treap、AVL、RBT……但是这里个人认为各项性能最综合的是SBT(Size Balanced Tree),当然可能是因为我自己写的Splay比较残了……还有,不等不提,CQF本人立了个flag:SBT快过其他任何BST。         传送门:国家集训

alpc_qleonardo 658

从零实现反激式电源仿真:LTspice高级应用实例

深入解析反激式开关电源的建模与仿真过程,利用LTspice实现从零搭建电路,精准验证电路仿真效果,提升电源设计效率与可靠性。

weixin_36149538的博客 1898

激光三角测量法:斜射与直射式技术的原理与应用解析

本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。

weixin_29280219的博客 415

傻逼树SBT:Size Balanced Tree的实现原理,增删改查,调平衡

为了调平衡,咱们必须要有左旋函数(leftRotate)、右旋函数(rightRotate) 调平每次变化了哪些节点,就需要再次检查和调平(maintain),maintain函数需要分LL,RR,LR,RL四种状况 查傻逼树SBT中是否有节点key,并返回离key最近的不为null的那个节点(pre),查询key函数:findLeastKeyNode 返回傻逼树SBT整体有多少个节点?size()函数 判断傻逼树是否为空树?isEmpty() put函数是更新,或者新增--没有返回值,内部操作add:ke

weixin_46838716的博客 1086

图像拼接(Image Stitching)

图像拼接(Image Stitching):是一项计算机视觉技术,它将多张重叠的图像合并为一张更大、无缝的全景图或广角视图。该技术广泛应用于全景摄影、地图制作、医学影像处理、计算机视觉及增强现实(AR)等领域。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2506

Size Balanced Tree(SBT树)整理

Size Balanced Tree(简称SBT)是一种平衡二叉搜索树,它通过子树的大小s[t]来维持平衡性质。它支持很多动态操作,并且都能够在O(log n)的时间内完成。 我做了简单的整理。挺好理解的。

细语呢喃 1万+

第1章 机器人SLAM算法工程师主要做什么的?(附SLAM学习路线及资料推荐)

对于想从事机器人与自动驾驶领域的在校大学生、研究生来说,建图定位算法工程师是一个极具发展潜力的岗位,而SLAM知识体系则是胜任该岗位的核心支撑。从基础的计算机工具、C++语言,到核心的开源框架、数学知识,再到硬件衔接与项目实践,每一个环节都不可或缺。建议大家结合自身兴趣确定侧重方向(如激光SLAM、融合定位),先通过开源项目建立实践认知,再补全理论知识,同时积极参与社区交流。

行知SLAM 955

关于YOLOv8的面试题(持续更新中...)

本章将计划更新关于YOLOv8中可能会成为面试题的关键技术点,计划持续更新,可能想到合适的问题我就会整理下更新到本博客中。

ice 4169

平衡二叉树之SBT(Size Balanced Tree)原理

优点严格的平衡性保证,操作效率稳定。子树大小信息便于统计类查询(如排名、范围查询)。缺点实现复杂度较高,维护成本较大。旋转操作频繁可能影响性能。SBT适用于需要高效动态插入、删除及统计查询的场景(如数据库索引)。本文的Java实现展示了其核心逻辑,读者可进一步扩展其他功能(如排名查询)。

xiaoyu❅的博客 629

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法笔记——SBT

SBT

m0_67142204的博客 815

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【学习笔记】SBT学习笔记

[## 一、什么是SBT SBT , 即 Size Balanced Tree,是一种平衡二叉排序树,根据其节点中 Size 域大小进行平衡,由陈启峰于2006年在冬令营提出 二、为什么写SBT: 书写简单:在常用的平衡树( Spaly , Treap , AVL , Red-Black Tree ……)中,SBT的码量较小,只是在原有 BST 的基础上加入 Maintain 函数以及对Si...

weixin_30892037的博客 1148

假人有限元模型

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

1503: [NOI2004]郁闷的出纳员 (SBT)

1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit:5 SecMemory Limit:64 MBSubmit:4094Solved:1496[Submit][Status] Description OIER公司是一家大型专业化软件公司,有着...

anvt77205的博客 116
上一篇: 基于LLRB 红黑树的 TreeMap 实现
下一篇: 树堆TreapMap 实现
binling
博客等级 码龄25年 21粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值