树上倍增法

article/2025/9/29 15:29:21

一 点睛

树上倍增法不仅可以解决 LCA问题,还可以解决很多其他问题。

F[i,j] 表示 i 2^j 辈祖先,即 i 节点向根节点走 2^j 步到达的节点。

u 节点向上走 2^0步,即为 u 的父节点 x, F[u,0] = x ;向上走 2^1 步到达 y,F[u,1] = y;向上走 2^2 步到达z,F(u,2) = z;向上走 2^3 步,节点不存在,令 F[u,3] =0。

F[i,j] 表示 i 的 2^j 辈祖先,即 i 节点向根节点走 2^j 步到达的节点。可以分成两个步骤:i 节点先向根节点走 2^(j-1) 步得到 F[i,j-1],再从 F[i,j-1] 节点出发向根节点走 2^(j-1) 步得到 F[F[i,j-1],j-1],该节点为F[i,j]。

递推公式 F[i,j]=F[F[i,j-1],j-1]。

二 算法设计

1 创建 ST,

2 利用 ST 求解 LCA。

三 图解

和暴力搜索中的同步前进方法一样,先让深度大的节点 y 向上走到与 x 同一深度,然后 x、y 一起向上走。和暴力搜索不同的是,向上走是按照倍增思想走,不是一步步向上走的,因此速度比较快。

1 怎样让深度大的节点 y 向上走到与 x 同一深度?

假设 y 的深度比 x 深度大,需要 y 向上走到与 x 同一深度,k=3,则求解过程如下。

a  y 向走 2^3 步,到达的节点的深度比 x 深度小,什么也不做。

b 减少增量,y 向上走 2^2 步,此时到达节点深度比 x 深度大,y 向上移,y=F[y][2]。

c 减少增量,y 向上走 2^1 步,此时到达节点深度与 x 深度相等。y 上移,y=F[y][1]。

d 减少增量,y 向上走 2^0 步,到达的节点深度比 x 深度小,什么也不做。此时 x,y 在同一深度。

总结,按照增量递减的方式,到达的节点深度比 x 深度小时,什么也不做;到达的节点深度大于或等于 x 深度时,y上移,直到增量为 0,此时,x、y 在同一深度。

2 x、y 一起向上走,怎么找到最近公共祖先?

假设 x、y 已到达同一深度,现在一起向上走,k=3,则其求解过程如下。

a x、y 同时向上走 2^3 步,到达的节点相同,什么也不做.

b 减少增量,x、y 同时向上走 2^2 步,此时到达节点不同,x、y 上移,x=F[x][2],y=F[y][2]。

c 减少增量,x、y 同时向上走 2^1 步,此时到达节点不同,x、y 上移,x=F[x][1],y=F[y][1]。

d 减少增量,x、y 同时向上走 2^0 步,此时到达节点相同,什么也不做。

此时 x、y 的父节点为最近公共祖先节点,即 LCA(x,y)=F[x][0]。

完整图解如下。

总结:按照增量递减的方式,到达的节点相同时,什么也不做;达到的节点不同时,同时上移,直到增量为 0。此时 x、y 的父节点为公共祖先节点。


http://chatgpt.dhexx.cn/article/fvLq1lF5.shtml

相关文章

光电倍增管国产型号及相关知识

国产光电倍增管 南京永纪,GDB235 参考网址 请教光电倍增管在安装、使用注意事项,谢谢 (amobbs.com 阿莫电子论坛) 光电倍增管(PMT)使用注意 光电倍增管(PMT)使用注意_滨松光子学商贸(中国)有限公司 (ham…

倍增node

倍增 普及组的内容,思想很简单,但是考的可以挺难 倍增是啥东西 “ 倍增,顾名思义,就是每次增加一倍。 展开来说,就是每次根据已经得到的信息,将考虑的范围增加一倍, 从而加速操作。倍增思想有…

倍增求LCA

一:定义 LCA指的是最近公共祖先。具体地,给定一棵有根数,若结点z既是结点x的祖先,也是结点y的祖先,则称z是x,y的公共祖先。在x,y的公共祖先中,深度最大的那个节点成为x,y…

倍增数组基础

应用: 给定一个数列a, 基本的倍增数组可以用O(1)的时间复杂度计算出区间[i,j]的最值。 具体操作: 维护倍增数组 1、状态 dp[j][i]表示区间从i到 i(2^j)-1,即以i开始长度为2^j 这个区间范围的最值。(下面以最小值为例) 2、状态转移…

倍增LCA

朴素算法求LCA,即暴力求解,当树近乎为一条链时,找祖先时一级一级向上跳,时间复杂度接近O(n),所以可以考虑一次跳尽可能大的距离,即倍增算法;一次跳2^i(i0,1,2....)级。 倍增法 一个节…

倍增算法

倍增算法 【序言】 我认为吧,所有能够优化复杂度的算法都是神奇的,所有能够化繁琐为形象的文字都是伟大的。一直觉得倍增算法是个很神奇的东西,所以决定写点东西纪念一下它。但是作为一个非常不称职的OIER,我非常讨厌在看别人的算法解析时整版的i,j,k等我看到鼠标…

浅谈倍增及应用

浅谈倍增 倍增思想 原理: 倍增,即成倍增长。在处理一系列序列数据时,倍增可通过指数级的增长快速覆盖所有数据。 倍增算法采用2倍增长的方式,其核心思想是建立以下数组T a[i][j] ,表示自i向后共 2 j 2^j 2j个数据的…

倍增(ST表与LCA)

倍增(ST表与LCA) 什么是倍增? 倍增,就是成倍增长。指我们进行递推时,如果状态空间很大,通常线性递推无法满足时空复杂度要求,那么可以通过成倍增长的方式,只递推状态空间中 2 的整…

V4L2-框架

1.概述 V4L2 是专门为linux 设备设计的一套视频框架,其主体框架在linux内核,可以理解为是整个linux系统上面的视频源捕获驱动框架。 相机驱动层位于HAL Moudle 与硬件层之间,借助linux 内核驱动框架,以文件节点的方式暴露接口给用…

V4L2学习笔记

首先附上,Linux内核网站: 入口 v4l2非常棒的一篇文章 入口 内核代码查看: 入口 一个博客文档: 入口 https://lwn.net/Articles/204545/ 别人整理 关于linux内核头函数: /usr/src/xxx 系列文 在其内部有media文件…

V4L2框架学习

V4L2框架 0 查看videodev2 0.1 头文件/usr/include/linux/videodev2.h 0.2 使用ioctl函数 使用ioctl函数 // 添加头文件 #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h>int ioctl (int __fd, unsigned long int __request, ...…

V4L2介绍

V4L2介绍 V4L2介绍主要功能框架v4L2编程 V4L2介绍 V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中&#xff0c;视频设备是设备文件&#xff0c;可以像访问普通文件一样对其进行读写&#xff0c;摄像头在/dev/video*下&#xff0c;如果只有一个视频…

linux V4L2子系统——v4l2架构(7)之V4L2应用编程

linux V4L2子系统——v4l2架构&#xff08;7&#xff09;之V4L2应用编程 备注&#xff1a;   1. Kernel版本&#xff1a;5.4   2. 使用工具&#xff1a;Source Insight 4.0   3. 参考博客&#xff1a; &#xff08;1&#xff09;Linux V4L2子系统-应用层访问video设备&a…

[2022.8.15]v4l2-ctl基本使用方法

v4l2-ctl使用帮助可以参考&#xff1a;https://www.mankier.com/1/v4l2-ctl 1 v4l2-ctl --list-devices 列出所有设备 USB 2.0 Camera: USB Camera (usb-0000:00:14.0-9):/dev/video0/dev/video1 一个USB camera对应两个设备&#xff1a;一个是图像/视频采集&#xff0c;一…

V4L2应用层分析

V4L2应用层分析 一、总述二、例子 一、总述 V4L2&#xff0c;即Video for Linux 2&#xff0c;是第二代为Linux打造的音频、视频驱动。相比第一代V4L&#xff0c;V4L2支持更多的设备&#xff0c;同时更加稳定。现今的视频设备&#xff0c;如USB摄像头&#xff0c;基本都支持V4…

v4l2数据结构分析

v4l2数据结构分析 文章目录 v4l2数据结构分析Video4Linux2设备v4l2_device媒体设备media_deviceVideo4Linux2子设备v4l2_subdevVideo4Linux2子设备的操作集v4l2_subdev_opsVideo4Linux2子设备的内部操作集v4l2_subdev_internal_opsVideo4Linux2控制处理器v4l2_ctrl_handlerVide…

摄像头V4L2编程应用开发

1.V4L2简介 Video for Linux two(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2是linux系统操作系统下一套用于采集图片、视频、和音视频数据的通用API接口&#xff0c;配合适当的视频采集设备和相应的驱动程序&#xff0c;可以实现图片、视频、音频等的采集。 在linu…

V4L2框架

前言 在分析v4l2之前最好具有的知识&#xff1a; 1.字符设备,因为v4l2是被枚举为字符设备。 2.内存分配和映射,比如相关数据结构的分配和buffer。 3.DMA&#xff0c;因为v4l2的数据传输用到了DMA。 4.I2C&#xff0c;因为很多传感器都是用的i2c接口。 5.文件系统的基本操作&am…

V4L2系列 之 V4L2驱动框架

目录 前言一、V4L2驱动框架概览1、应用层 -》中间层-》驱动层2、主要代码文件(Linux 4.19版本内核) 二、怎么写V4L2驱动1、如何写一个设备的驱动&#xff1f;2、Video设备主要结构体3、怎么写V4L2驱动 三、V4L2的调试工具1、v4l2-ctl2、dev_debug3、v4l2-compliance 前言 本篇文…