首页 > 其他分享 >平衡树学习笔记(替罪羊)

平衡树学习笔记(替罪羊)

时间:2024-02-28 22:02:39浏览次数:26  
标签:子树 return int 替罪羊 mid 笔记 平衡 节点 重建

替罪羊应该是所有平衡树中最简单的了(但这东西是真的恶心),它的主要思想是在发现子树不平衡时把子树拍平重建。

首先我们考虑什么时候我们认为这个子树是不平衡的。
我们可以设置一个常量 \(eps\),当有一棵子树的大小超过了它父节点子树大小乘 \(eps\),那么我们就可以重建这棵子树了。
一般情况下我们选择 0.75 作为 \(eps\) 的值。

重建过程就差不多是模拟了。我们中序遍历这棵子树,把所有节点都记录下来。然后再递归去建树。
对于一个区间 \(\left[L, R\right]\) 我们把最中间的那个树当作新的根节点,这样能使其更平衡,再递归建立左右子树。

重建代码如下:

bool Check(int u) {  //  判断是否要重建
  return 1.0 * max(w[w[u].l].s, w[w[u].r].s) > eps * w[u].s;
}

void Mid(int u) {  // 中序遍历(左->根->右)
  if (u) {
    Mid(w[u].l);
    w[u].c && (p[++cnt] = u);  //  把节点记录下来
    Mid(w[u].r);
  }
}

int Build(int l, int r) {  // 建树
  if (l <= r) {
    int mid = l + r >> 1;
    w[p[mid]].l = Build(l, mid - 1);  //  递归建左子树
    w[p[mid]].r = Build(mid + 1, r);  //  递归建右子树
    Push_up(p[mid]);                  //  建立当前节点
    return p[mid];                    //  返回当前节点编号
  }
  return 0;
}

int rBuild(int u) {      //  拍平+重建+返回重建后子树的根(记得把rBuild(u)的值赋值给u)
  cnt = 0;               //  清空回收的个数
  Mid(u);                //  把节点记录下来
  return Build(1, cnt);  //  建树
}

标签:子树,return,int,替罪羊,mid,笔记,平衡,节点,重建
From: https://www.cnblogs.com/caoshurui/p/18042040

相关文章

  • 基础线段树笔记
    作为学会的第一个高级数据结构,当然要提早记录啦(虽然好像已经拖了一学期了)线段树的主要用途是针对一些较复杂的区间问题,如:给你一个长度为\(n\)的序列,还有\(m\)次操作。对于每次操作,让你将一个位置\(x\)加\(y\),或查询区间\(\left[L,R\right]\)的和。首先,如果只要求......
  • 构建之法阅读笔记1
    第一章作者谈到了软件开发的过程,过程包括玩具阶段、业余爱好阶段、探索阶段、成熟的产业阶段。我觉得自己处在业余爱好者的阶段(上学期数据库大作业要求写一个图书馆里系统,于是就写了一个图书管理网站,当时做完的时候感觉挺有成就感的,虽然过程十分痛苦),在讨论商业软件和爱好者的程序......
  • CF836F 做题笔记
    传送门非常好题目,使我原地旋转。首先数据这么小显然直接暴力求出每个\(A_i\)的取值范围。由于每个\(A_i\)只能有一个取值,所以源点先给所有\(A_i\)连一个限流为\(1\),费用为\(0\)的边。同时显然还要给每个值域点(不是\(A_i\))向汇点连限为\(inf\),费用为\(0\)的边......
  • 洛谷P2762 太空飞行计划问题 笔记
    传送门神奇的题目。正解就是源点向实验连边,边权为收益。然后仪器向汇点连边,边权为代价。然后答案就是所有实验收益之和-最小割。考虑证明。首先所有实验收益之和显然对应了做所有的实验。然后考虑割掉一条边。如果割掉的是源点->实验,那么就是不做这个实验。如果割了仪器->汇......
  • 置换群 / Polya 原理 / Burnside 引理 学习笔记
    置换群/Polya原理/Burnside引理学习笔记在GJOI上做手链强化,经过长达三小时的OEIS和手推无果后开摆,喜提rnk12,故开始学习置换群相关内容。笔记主要以Polya原理和Burnside引理的应用为主,所以会非常简单,很大一部分的群论概念和证明不会写,因为我不会。基础群论定......
  • Go语言精进之路读书笔记第38条——尽量优化反复出现的if err != nil
    Go在最初设计时就有意识地选择了使用显式错误结果和显式错误检查38.1两种观点显式的错误处理方式让Go程序员首先考虑失败情况,这将引导Go程序员在编写代码时处理故障,而不是在程序部署并运行在生产环境后再处理。而为反复出现的代码片段iferr!=nil{...}所付出的成本已基本被......
  • 课堂笔记1
    1、计算最小公倍数我的第一想法:两个数的最小公倍数只能是两个数其中的一个、两个数的乘积、或者小于两个数的乘积。通过一个for循环(限制条件为:i=0;i<两个数的乘积),然后用if语句判断i是否能整除i且i小于两个数的乘积,是就输出i否则输出两个数的乘积。写出来发现结果是0,看了一下......
  • 《Decoupling Representation and Classifier for Long-Tailed Recognition》阅读笔记
    论文标题《DecouplingRepresentationandClassifierforLong-TailedRecognition》用于长尾识别的解耦表示和分类器作者BingyiKang、SainingXie、MarcusRohrbach、ZhichengYan、AlbertGordo、JiashiFeng和YannisKalantidis来自FacebookAI和新加坡国立大学......
  • 王概凯阅读笔记
    (1)什么是架构:首先把架构的概念讨论明白,然后在对架构进行分析才显得清晰有意义。架构是人类发展过程中,由被动地去认识这个世界,变成主动的去认识,并以更高的效率去改造这个世界的方法。由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制,使得这些部分能够有机的结合为一......
  • 《构建之法》读书笔记
    构建之法读书心得体会读完《构建之法》第一章后,我对软件开发中的各种问题和挑战有了更深入的理解。这本书以其独特的视角,清晰的分析和实用的建议,使我重新审视了软件开发的过程和方法。以下是我的主要心得体会:1.**理解复杂性**:书中强调了理解复杂性在软件开发中的重要性。我们不......