首页 > 编程语言 >算法学习笔记(6): 树链剖分

算法学习笔记(6): 树链剖分

时间:2023-01-12 17:12:48浏览次数:63  
标签:... 剖分 top 树链 算法 dfn 线段

树链剖分

树链剖分是一个很神奇,但是在树上可以完成一些区间操作问题

简单来说,就是把一棵树分成一条条的链,通过维护链上的信息来维护整棵树的信息

基础知识可以参考我的另外一篇博客:算法学习笔记(5): 最近公共祖先(LCA)

这里假设你已经掌握了上述博客中的所有相关知识,并清晰了其背后的原理


性质?发现?

当我们动手模拟寻找dfn的步骤时,我们不难发现,同一条链上的dfn序是连续的

意味着我们可以通过结点的dfn序来维护其信息

由于涉及到区间修改或者查询之类的问题,一般来说需要用到线段树的辅助

如果不明白线段树的话,建议不要食用本文


具体用法

我们以模板题:【模板】轻重链剖分/树链剖分 - 洛谷为例

由于我们需要修改两个点的路径上点的权值,依据上文我们已经知道在链上的dfn序是连续的,很明显,我们需要找到两个点路径之间所有在同一条链上的部分进行区间修改

联想到树链剖分求LCA的过程,我们只需要在两个点向上跳的时候顺便维护其信息即可

类C伪代码可以参考如下

void change(int x, int y, data...) {
    // 不在同一条链上!
    while (top[x] != top[y]) {
        // 保证top较低的点先跳,防止跳飞
        if (dep[top[x]] < dep[top[y]]) swap(x, y);
        modify(dfn[top[x]], dfn[x], data...);
        x = fa[top[x]];
    }
    // 保证x的dfn较小
    if (dep[x] > dep[y]) swap(x, y);
    modify(dfn[x], dfn[y], data...);
}

modify(x, y, data...)指的是根据data维护区间[x, y]上的信息

注意:如果使用了线段树,在建树的时候一定要注意初始值。我指的是点dfn[x]上的值才是x的初始值。

如果你发现你似乎需要写两个change函数,但是你又没想到可以替代的名字

可以采用把线段树的代码用namespace包含进去(我常用seg作为namespace的名字,下文我会沿用这个名字)

具体来说,例如:

namespace seg {
    线段树要的数据...;
    void build(...) { ... }
    void change(...) { ... }
    void query(...) { ... }
    ....
}

在namespace之外,就可以采用seg::change(...)之类没有歧义的写法了

这样很好的避免了词汇匮乏命名混乱的问题

复杂度:自然还是要分析一波。由于树链剖分最多会分成logN个区间,每个区间的操作基于线段树区间修改的复杂度,所以复杂度为\(O(Nlog^2N)\)


这个部分……讲的好少啊

管他的,下课!

标签:...,剖分,top,树链,算法,dfn,线段
From: https://www.cnblogs.com/jeefy/p/17047217.html

相关文章

  • LeetCode刷题(43)~汉明距离【异或+布赖恩·克尼根算法】
    题目描述两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数x和y,计算它们之间的汉明距离。注意:0≤x,y<231.示例:输入:x=1,y......
  • LeetCode刷题(45)~位1的个数【布赖恩·克尼根算法】
    题目描述编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为‘1’的个数(也被称为汉明重量)。示例1:输入:00000000000000000000000000001011输出:3解释:......
  • 【计算几何】浅谈凸包Andrew算法
    前置知识基础计算几何定义。引文这样一个问题,有许多个杆子,需要用绳子围住所有的杆子,然鹅没有很多的绳子,求最短需要多少绳子。整个图大概是这样的,正文我们要如何解......
  • 算法刷题 Day 15 | 层序遍历 226.翻转二叉树 101. 对称二叉树
    今日内容:层序遍历10翻转二叉树对称二叉树2层序遍历看完本篇可以一口气刷十道题,试一试,层序遍历并不难,大家可以很快刷了十道题。题目链接/文章讲解/视......
  • Java算法之冒泡排序(超详细)
    冒泡排序基本思想核心思想是从头开始让相邻的两个元素进行比较,符合条件就交换位置,这样就把最大值或者最小值放到数组的最后面了;接着再从头开始两两比较交换,直到把最大值或者......
  • Bert算法:语言模型-BERT详细介绍
    本文的目的是向NLP爱好者们详细解析一个著名的语言模型-BERT。全文将分4个部分由浅入深的依次讲解。1.Bert简介BERT是2018年10月由GoogleAI研究院提出的一种预训练模型。B......
  • TapTap 算法平台的 Serverless 探索之路
    分享人:陈欣昊,TapTap/IEM/AI平台负责人摘要:本文主要介绍心动网络算法平台在Serverless上的实践。《TapTap算法平台的Serverless探索之路》Serverless在构建应用上为......
  • 算法--2023.1.11
    1.力扣146--LRU缓存classLRUCache{classNode{publicintkey;publicintvalue;publicNodepre,next;publicNode(){}......
  • KMP算法理解
    KMP我的理解是一个通过预处理储存字符串自身具有的前后缀一致性质来达到快速处理“字符串匹配”“字符串重复”的问题的算法,核心是\(next\)数组。以字符串匹配为例......
  • m分集2跳OFDM系统中基于功率分配和子载波配对算法的信道容量matlab仿真
    1.算法描述       随着当代无线通信事业的迅猛发展,无线频谱资源已显得越来越匮乏,传统固定静态的无线频谱分配模式和策略,很难为未来的无线通信事业的进一步发展......