首页 > 其他分享 >全局平衡二叉树

全局平衡二叉树

时间:2022-10-08 19:45:06浏览次数:87  
标签:LCT 每条 Splay 二叉树 平衡 全局

全局平衡二叉树,其实说白了就是在树链剖分的基础上再次对每条链以相对平衡的方法再次重构成一颗固态的二叉树的形态,或者说在 LCT 的基础上把 Splay 换成满足全局平衡的二叉树,然后每步暴力往上跳即可。

以下是详细思想。


考虑 LCT 在静态树上常数很大,很大程度上是因为其 splay/access/makeroot 次数太多了。

如果我们能在 LCT 中按照一种合适的方法重建 Splay 的结构,把 Splay 换成某种静态的二叉树结构,则不用做 splay/access/makeroot 操作了,直接暴力跳父亲即可。

怎么换呢?

一种简单的想法是把每条链重构成一颗单独的线段树/静态平衡 BST

这个东西其实就和普通的树剖区别不大了……单点修改/链查询复杂度容易发现是单次 \(O(\log^2n)\) 的。

为什么这个东西是两只老哥的呢?

因为在每条链上,平均每个节点的高度是 \(O(\log n)\) 的,而且这个东西可以被毒瘤出题人把 \(O(\log n)\) 条取满老哥的链首尾相接成链然后询问……

考虑如何避免出现这种几个取满老哥的位置首尾相接的毒瘤情况

注意到平衡二叉树构造时是直接取中点拆成左右两段区间递归下去的,我们觉得这不好;一部分节点子树很大,你应该在这个点这里把它挪的高一点,避免在这里取满老哥。

考虑到中点其实就是一条链的重心,我们要把子树大小作为一个决定谁高谁低的指标的话,就应当求这条链的带权重心;原来求出的平衡二叉树就是一条链的点分树,而我们需要的全局平衡二叉树就是一条链的带权点分树,其中每个节点所在的子树对应重链上的一段区间。这点就和 Splay 维护 LCT 类似了。

因此算法流程就出来了:

  1. 进行轻重链剖分,把每条链提取出来。
  2. 对每个结点按轻子树大小之和定点权。
  3. 对每条重链,求出其带权点分树,即全局平衡二叉树。
  4. 对每条轻边,按类似 LCT 的方式,儿子认父亲,父亲不认儿子。
  5. 每条链的信息在平衡树上维护,单点修改/链查询直接暴力跳就好了。

这样,整个算法就完成啦!

容易证明,在这种结构上,树的高度是 \(O(\log n)\) 的,于是就完了。

当然,在随机数据下,这个算法实际运行效率和树剖差别不大……甚至有的时候常数还更大……

不过,如果使用这个算法来分治,我们就可以叫做树的链分治了。


习题:

代码咕咕。

标签:LCT,每条,Splay,二叉树,平衡,全局
From: https://www.cnblogs.com/myee/p/globally-balanced-binary-tree.html

相关文章

  • leetcode 94. Binary Tree Inorder Traversal 二叉树的中序遍历(中等)
    一、题目大意给定一个二叉树的根节点root,返回它的中序遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[......
  • 剑指Offer-55-二叉树的深度/力扣-104-二叉树的最大深度
    intmaxDepth(TreeNode*root){ if(!root)return0; intleft=maxDepth(root->left); intright=maxDepth(root->right); //返回二叉树的深度 //只要......
  • Vue全局公共服务类mixin
    首先,简单介绍下mixin:Mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类Mixin类通常作为功能模块使用,在需要......
  • leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal 从中序
    一、题目大意给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗二叉树。示例1:输入:ino......
  • LeetCode - #144 二叉树的前序遍历
    前言我们社区陆续会将顾毅(Netflix增长,《iOS面试之道》作者,ACE职业健身教练。)的Swift算法题题解整理为文字版以方便大家学习与阅读。LeetCode算法到目前我们已经更新到......
  • .Net CLR GC plan_phase二叉树和Brick_table
    楔子别那么懒,勤快点。以下取自CLRPreView7.0。主题GC计划阶段(plan_phase)主要就两个部分,一个是堆里面的对象构建一颗二叉树(这颗二叉树的每个节点包含了诸如对象移动......
  • 平衡二叉树的平衡代码实现
    AVL树是一种平衡二叉树,得名于其发明者的名字(Adelson-Velskii以及Landis)。(可见名字长的好处,命名都能多占一个字母出来)。平衡二叉树递归定义如下:左右子树的高度差小于......
  • 数据结构-平衡二叉树的基本旋转
    1、AVL树(平衡二叉树)的定义平衡二叉树 全称叫做 平衡二叉搜索(排序)树,简称AVL树。英文:BalancedBinaryTree(BBT),注:二叉查找树(BST)AVL什么意思?AVL是大学教授G.M.A......
  • 二叉树与树、森林之间的转换
    一、成树、森林转换为二叉树树转化成二叉树的步骤:树中所有相邻兄弟结点之间加一条线对树中的每个结点只保留它与长子之间的连线,删除与其他孩子之间的连线以树的根结点......
  • JavaScript 学习-48.$.ajaxSetup方法设置AJAX的全局默认设置
    前言$.ajaxSetup方法用于设置AJAX的全局默认设置。之后执行的所有AJAX请求,如果对应的选项参数没有设置,将使用更改后的默认设置。这方便我们设置error统一返回样式。示......