安塔的全局平衡二叉树学习笔记

木木!

2020-03-21 22:31:30

Personal

# 前言 切题连 WA,不想打代码,就顺手学一下算法。正巧我有个朋友在学全局平衡二叉树,然后我就想学一下,然后不到十分钟会了,于是就有了这篇博客。 # 前置知识 + [动态DP](https://www.luogu.com.cn/problem/P4719) (只要知道动态 DP 在干什么,学会树链剖分实现即可,~~别看是黑题其实不难~~) + 不需要任何高级的平衡树知识(当然基础知识还是要的)。 # 树剖为什么慢 首先我们发现线段树的可调整性太差,节点数给死了树高就定死了,根本没法调整,所以我们第一步是抛弃线段树换用平衡树。 这里假设读者都会了平衡树维护序列的相关知识,不会的可以去 [文艺平衡树](https://www.luogu.com.cn/problem/P3391) 看一眼,不需要学习 Splay。简单说一下,如果将平衡树中的每个点对应为序列的每个元素,然后中序遍历顺序是原序列顺序,那么平衡树中的每一个子树都是序列的一个区间。 ![](https://cdn.luogu.com.cn/upload/image_hosting/e3hrfet6.png) 首先,如果按照重链为中心的角度看待树剖后的图(重链上数字为结点的 DFS 序),可以看成这样: ![](https://cdn.luogu.com.cn/upload/image_hosting/qdtftzsn.png) 这里的每条重链都用一颗平衡二叉树维护,结点先是从某个位置开始,一步一步跳到根,然后从根杀到另外一个重链的平衡二叉树的某个位置,再继续往上跳,直到跳到根节点。 将每个重链用一个平衡二叉树维护,那么整个修改过程可以视作在这棵树上往上跳: ![](https://cdn.luogu.com.cn/upload/image_hosting/swz8oisl.png) 这里所有的二叉树都是绝对平衡的,在某一个长度为 $n$ 的重链上跳的次数是 $\Theta(\log n)$,但是一共要最多 $\Theta(\log n)$ 个重链,最终时间复杂度是 $\Theta(\log^2 n)$。 问题在哪里呢?因为我们的二叉树太平衡了。 # 全局平衡二叉树 很显然,我们有优化的地方。 比如说,如果一个重链的二叉树的某一个结点上面挂了一大堆轻儿子,那么就可以把这个节点的深度适当抬浅,那么所有在这些轻儿子里面的修改都能少跳几下。 ![](https://cdn.luogu.com.cn/upload/image_hosting/x2mhk985.png) (最深的点只需要跳 4 下,比上面 7 下优化了很多) 利用 Splay 的思想进行这个抬浅操作,就是 LCT 保证时间复杂度为 $\Theta(\log n)$ 的方法。具体证明需要用到势能分析,不展开。 但是我们这个是静态的啊!动态 DP 又不需要调整树结构,树的结构是完全静态的! 对于只需要修改和查询的序列问题,因为序列是静态的,就可以直接建立一颗平衡的二叉树(其实相当于线段树),这样不仅时间复杂度保证为 $\Theta(\log n)$,码量也低,常数也小。 那么,在做动态 DP 的时候,也可以用类似的思路,就不用把 LCT 搬出来杀鸡用牛刀了。 这里的目标是要建树并使最终深度最小化。最终的深度定义为每一个点到根所需要跳的步数,这里的跳包括在重边二叉树中的跳,也包括在轻边上的跳。 再放一遍某张图方便理解下面的一段: ![](https://cdn.luogu.com.cn/upload/image_hosting/itleyhn3.png) 按照“尽量均分”的策略,在每一次选择根的时候,只需要选择那个能让根下的子树们(包括两个重儿子和一些轻儿子)点数最相近的根就好。实际上就是递归选择重链上的一个带权重心,不赘述。 # 时间复杂度 每次询问的时间复杂度是 $\Theta(\log n)$,因为每次选根我们都让他的子树们尽量均分,这颗全局平衡二叉树的深度是 $\Theta(\log n)$。 建树的时间复杂度证明也很简单。因为在处理某一个重链的过程中,点被扫描的次数相当于这个点在重链排成的二叉树上的深度,而这个深度显然不会超过全局的深度 $\Theta(\log n)$,最后时间复杂度就是 $\Theta(n\log n)$,在所有点形成一条链的时候取到。 # 拓展 有没有 $\Theta(n)$ 的建树法? 【咕咕咕】 # 参考资料 图均由 [draw.io](www.draw.io) 制作。 + [动态DP之全局平衡二叉树 -T\_Y\_P\_E](https://www.cnblogs.com/T-Y-P-E/p/10595785.html) + [DP也要搞动态,动态DP与全局平衡二叉树详(lue)解 -敌敌畏58](https://www.cnblogs.com/zhangjianjunab/p/12187184.html)