当前位置: 首页 > news >正文

LCA——最近公共祖先

LCA问题是指在一棵树中找到两个节点的最近公共祖先。最近公共祖先是指两个节点在树中的最近的共同祖先节点。例如,在下面这棵树中,节点 6 6 6和节点7的最近公共祖先是节点 3 3 3

        1/   \2     3/ \   / \4   5 6   7

解决LCA问题的方法有很多种,下面介绍几种常见的方法。

树的深度优先搜索(DFS)算法
DFS算法可以遍历整棵树,并记录每个节点的父节点。当我们找到两个节点的路径时,我们可以比较路径中的节点,找到它们的最近公共祖先。

具体步骤如下:

从根节点开始,进行深度优先搜索,记录每个节点的父节点。
找到第一个节点的路径,记录路径上的所有节点。
找到第二个节点的路径,记录路径上的所有节点。
从两个路径的末尾开始,比较路径中的节点,直到找到它们的最近公共祖先。
这种方法的时间复杂度为 O ( n ) O(n) O(n),其中 n n n是树中节点的数量。

树的Tarjan算法
Tarjan算法是一种基于并查集的算法,可以在一次遍历中找到多个节点的最近公共祖先。这种方法的时间复杂度为 O ( n + q ) O(n+q) O(n+q),其中 n n n是树中节点的数量, q q q是查询的数量。

具体步骤如下:

从根节点开始,进行深度优先搜索,记录每个节点的父节点和祖先节点。
对于每个查询,使用并查集维护查询节点的祖先节点。
对于每个查询,从查询节点开始,向上遍历树,将遍历到的节点加入并查集中,直到找到一个已经在并查集中的节点,这个节点就是查询节点的最近公共祖先。
这种方法的优点是可以在一次遍历中处理多个查询,因此适用于查询数量较多的情况。

除了这些方法,还有其他一些解决LCA问题的算法,例如倍增算法、树链剖分算法等。具体使用哪种方法取决于树的结构和问题的要求。

树上倍增(Tree Upward Doubling)是一种解决最近公共祖先(LCA)问题的常用算法之一。它利用了树的特性,通过预处理和查询操作来找到两个节点的最近公共祖先。

树上倍增算法的核心思想是将每个节点的跳跃步长翻倍,以便在查询时能够快速跳到更高层的祖先节点。具体步骤如下:

预处理阶段:

对于每个节点,计算它的 2 i 2^i 2i级祖先(其中 i i i 0 0 0开始递增)。
使用深度优先搜索(DFS)遍历树,记录每个节点的深度和父节点。
对于每个节点 v v v,计算 v v v的第 2 i 2^i 2i级祖先为 v v v的父节点的第 2 ( 2^( 2( i ^i i − ^- 1 ^1 1 ) ^) )级祖先。
查询阶段:

对于给定的两个节点 u u u v v v,假设深度 ( u ) (u) (u) > 深度 ( v ) (v) (v)
从深度 ( u ) (u) (u)开始,通过不断将 u u u跳到更高层的祖先节点,直到深度 ( u ) (u) (u) = 深度 ( v ) (v) (v)
在每一步跳跃中,将u跳到它的第 2 i 2^i 2i级祖先,其中i是满足深度 ( u ) − 2 i ≥ (u) - 2^i ≥ (u)2i 深度 ( v ) (v) (v)的最大值。
如果 u = v u = v u=v,说明已经找到了最近公共祖先。
否则,同时将 u u u v v v跳到它们的第 2 i 2^i 2i级祖先,继续进行下一步跳跃。
重复上述步骤,直到 u u u v v v的父节点相同,这个父节点就是它们的最近公共祖先。
树上倍增算法的时间复杂度为 O ( n l o g ( n ) ) O(n~log(n)) O(n log(n))的预处理时间和 O ( l o g ( n ) ) O(log(n)) O(log(n))的查询时间,其中 n n n是树中节点的数量。这使得它在处理多次查询的情况下非常高效。

相关文章:

LCA——最近公共祖先

LCA问题是指在一棵树中找到两个节点的最近公共祖先。最近公共祖先是指两个节点在树中的最近的共同祖先节点。例如,在下面这棵树中,节点 6 6 6和节点7的最近公共祖先是节点 3 3 3。 1/ \2 3/ \ / \4 5 6 7解决LCA问题的方法有很多种&#xff…...

游戏开发与硬件结合,开启全新游戏体验!

游戏与硬件的结合可以通过多种方式实现,从改善游戏体验到创造全新的游戏玩法。以下是一些常见的游戏与硬件结合的方式: 虚拟现实(VR)和增强现实(AR)技术:VR和AR技术使玩家能够沉浸式地体验游戏…...

测试框架pytest教程(4)运行测试

运行测试文件 $ pytest -q test_example.py 会运行该文件内test_开头的测试方法 该-q/--quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中,但如果写在类中,类名需要是Test开头,非Test开头的类下的test_方法不会被搜集为用…...

Linux 上 离线部署GeoScene Server Py3 运行时环境

默认安装ArcGIS Pro的时候,会自动部署上Python3环境,所以在windows上不需要考虑这个问题,但是linux默认并不部署Py3,因此需要单独部署,具体部署可以参考Linux 上 ArcGIS Server 的 Python 3 运行时—ArcGIS Server | A…...

Python+request+unittest实现接口测试框架集成实例

这篇文章主要介绍了Pythonrequestunittest实现接口测试框架集成实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 1、为什么要写代码实现接口自动化 大家知道很多接口测试工具可以实现对接口的测试&#xf…...

django/flask+python+vue汽车租赁管理系统_1ma2x

开发语言:Python 框架:django/flask Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm . 课题主要分为三大模块:即管理员模块、用户模块和普通管理员模块&#xff0…...

胜者打仗,就像高山上决开积水,势不可挡

胜者打仗,就像高山上决开积水,势不可挡 【安志强趣讲《孙子兵法》16讲】 【原文】 是故胜兵先胜而后求战,败兵先战而后求胜。善用兵者,修道而保法,故能为胜败之政。 【注释】 修道:指从各方面修治“先立于不…...

stm32的命令规则

stm32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下:...

1. HBase中文学习手册之揭开Hbase的神秘面纱

揭开Hbase的神秘面纱 1.1 欢迎使用 Apache Hbase1.1.1 什么是 Hbase?1.1.2 Hbase的前世今生1.1.3 HBase的技术选型?1.1.3.1 不适合使用 HBase的场景1.1.3.2 适合使用 HBase的场景 1.1.4 HBase的特点1.1.4.1 HBase的优点1.1.4.2 HBase的缺点 1.1.5 HBase设计架构 1.…...

[线程/C++]线程同(异)步和原子变量

文章目录 1.线程的使用1.1 函数构造1.2 公共成员函数1.2.1 get_id()1.2.2 join()2.2.3 detach()2.2.5 joinable()2.2.6 operator 1.3 静态函数1.4 call_once 2. this_thread 命名空间2.1 get_id()2.2 sleep_for()2.3 sleep_until()2.4 yield() 3. 线程同步之互斥锁3.1 std:mute…...

全球网络加速器GA和内容分发网络CDN,哪个更适合您的组织使用?

对互联网用户来说,提供最佳的用户体验至关重要:网页加载时间过长、视频播放断断续续以及服务忽然中断等问题都足以在瞬间失去客户。因此可以帮助提高您的网站或APP提高加载性能的解决方案就至关重要:全球网络加速器和CDN就是其中的两种解决方…...

蓝凌OA custom.jsp 任意文件读取

​曾子曰:“慎终追远,民德归厚矣。” 漏洞复现 访问漏洞url: 出现漏洞的文件为 custom.jsp,构造payload: /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…...

(二)结构型模式:7、享元模式(Flyweight Pattern)(C++实例)

目录 1、享元模式(Flyweight Pattern)含义 2、享元模式的UML图学习 3、享元模式的应用场景 4、享元模式的优缺点 5、C实现享元模式的简单实例 1、享元模式(Flyweight Pattern)含义 享元模式(Flyweight&#xff09…...

laravel 多次查询请求,下次请求清除上次请求的where 条件

在Laravel中,可以使用where方法来添加查询条件,但是每次添加where条件时,都会在查询构造器中持久化这些条件,直到你手动重置它们。所以,如果你想在下一次查询中清除上次查询的where条件,有以下几种选择&…...

C++根据如下使用类MyDate的程序,写出类MyDate的定义,MyDate中有三个数据成员:年year,月month,日day完成以下要求

题目: 根据如下使用类MyDate的程序,写出类MyDate的定义,MyDate中有三个数据成员: 年year,月month,日day int year,month,day; void main() { MyDate d1, d2; d1.set(2015, 12, 31); d2.set(d1); d1.…...

微盟集团中报增长稳健 重点发力智慧零售AI赛道

零售数字化进程已从渠道构建走向了用户的深度运营。粗放式用户运营体系无法适应“基于用户增长所需配套的精细化运营能力”,所以需要有个体、群体、个性化、自动化运营——即在对的时候、以对的方式、把对的内容推给用户。 出品|产业家 2023年已经过半,经济复苏成为…...

设计模式(7)模板方法模式

一、定义: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 //模板方法抽象类 public abstract class AbstractClass {//模板方法publ…...

2308C++协程流程9

参考 #include <协程> #include "简异中.cpp" //用来中文定义的.元<类 T>构 P;元<类 T>构 任务{用 承诺型P<T>;任务()默认;动 符号 协待()常 无异{构 等待器{极 直接协()常 无异{中 p.是准备好();}协柄 挂起协(协柄<>o)常 无异{p.连续…...

基于学习交流社区的自动化测试实现

一 项目介绍 项目名称 项目名称&#xff1a; 学习交流社区 项目介绍 项目介绍&#xff1a; 学习交流社区是一个基于Spring的前后端分离的在线论坛系统。使用了MySQL数据库来存储相关信息&#xff0c;项目完成后使用Xshell将其部署到云服务器上。 前端页面&#xff1a; 前端共由…...

2023-08-21力扣每日一题

链接&#xff1a; 2337. 移动片段得到字符串 题意&#xff1a; L可以和左边的_交换&#xff0c;R可以和右边的_交换&#xff0c;求判断A是否能通过交换&#xff08;不限次数&#xff09;变成B 解&#xff1a; 观察可知&#xff0c;如果存在RL,一定不能交换出LR&#xff0c…...

对象存储服务-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务&#xff0c;适合存储非结构化数据&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…...

Yarn介绍及快速安装 - Debian/Ubuntu Linux

1.Yarn介绍 Yarn 是一个用于管理 JavaScript 包的快速、可靠和安全的包管理器。它是由 Facebook、Google、Exponent 和 Tilde 团队共同开发的&#xff0c;旨在提供比 npm 更快速、可靠的包管理体验。 以下是 Yarn 的一些主要特点和优势&#xff1a; 快速安装&#xff1a;Yarn…...

【新日语(2)】第10課 中国の生活に慣れるかどうか少し心配です

第10課 中国の生活に慣れるかどうか少し心配です 注释&#xff1a; &#xff5e;かどうか&#xff1a;“是否”。 练习A 一、例句 田中さんは鈴木さんに、30分ぐらい遅れると言いました。 田中先生告诉铃木先生&#xff0c;他会迟到大约30分钟。 注释&#xff1a; &…...

Python 网页解析初级篇:BeautifulSoup库的入门使用

在Python的网络爬虫中&#xff0c;网页解析是一项重要的技术。而在众多的网页解析库中&#xff0c;BeautifulSoup库凭借其简单易用而广受欢迎。在本篇文章中&#xff0c;我们将学习BeautifulSoup库的基本用法。 一、BeautifulSoup的安装与基本使用 首先&#xff0c;我们需要使…...

Spring Schedular 定时任务

大家好 , 我是苏麟 , 今天带来定时任务的实现 . Spring网站 : 入门 |计划任务 (spring.io) 什么是定时任务 通过时间表达式来进行调度和执行的一类任务被称为定时任务 定时任务实现 1.Spring Schedule (Spring boot 默认整合了) 2.Quartz(独立于Spring 存在的定时任务框架…...

营业额统计

营业额统计 # 题目描述 Tiger 最近被公司升任为营业部经理&#xff0c;他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger 拿出了公司的账本&#xff0c;账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日&…...

使用lodash的throttle函数会触发两次

当使用lodash的throttle函数时会触发两次&#xff0c;分别在最开始和最后。 严格来说不算是bug&#xff0c;因为官方文档写的很清楚。throttle函数其实有三个参数&#xff1a; _.throttle(func, [wait0], [options]) func: 要节流的函数 wait: 等待时间 options: 选项 op…...

如何使用CSS实现一个瀑布流布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现瀑布流布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚…...

dfs之有重复字符串的排列组合

https://leetcode.cn/problems/permutation-ii-lcci/description/ ■ 题目描述 考古问题&#xff0c;假设以前的石碑被打碎成了很多块&#xff0c;每块上面都有一个或若干个字符&#xff0c;请你写个程序来把之前石碑上文字可能的组合全部写出来&#xff0c;按升序进行排列。…...

Java之抽象类

Java之抽象类 抽象类概念抽象类如何使用抽象类的特性 作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a;zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f49…...

网站建设沛宣/曲靖seo建站

优点和使用场景SQL Server 内存中列存储索引通过使用基于列的数据存储和基于列的查询处理来存储和管理数据。 列存储索引适合于主要执行大容量加载和只读查询的数据仓库工作负荷。 与传统面向行的存储方式相比&#xff0c;使用列存储索引存档可最多提高 10 倍查询性能&#xff…...

哪个网站做香烟回收/2022最近比较火的营销事件

CSS中背景图片的定位&#xff0c;困扰我很久了。今天总算搞懂了&#xff0c;一定要记下来。 在CSS中&#xff0c;背景图片的定位方法有3种&#xff1a; 1&#xff09;关键字&#xff1a;background-position: top left; 2&#xff09;像素&#xff1a;background-position: 0px…...

深圳城乡和住房建设局网站/中国十大企业管理培训机构

数据类型是用来约束插入到字段中的值的。 在关系数据库中&#xff0c;数据类型是在定义表的时候就指定的。 在Cassandra中&#xff0c;字段类型由校验器(validator)和比较器(comparator)来给出&#xff0c;其中validator用来约束字段值的类型&#xff0c;而comparator用来约束字…...

西安工程网站建设/西安百度竞价推广

Linux 6.0下DNS服务器搭建详细步骤&#xff0c;根据实验一步一步写的&#xff0c;绝对有用&#xff01;下载地址转载于:https://blog.51cto.com/lihushan/895421...

潍坊网站建设公司排名/搜索词排行榜

Linux主机名的设置 Linux主机名的设置步骤如下&#xff1a; 1、在/etc/sysconfig/network文件中修改HOSTNAME的值为要设置的主机名。 HOSTNAMEmyhost 2、在/etc/hosts文件末尾增加如下一行内容&#xff1a; 127.0.0.1 myhost 3、reboot系统&#xff0c;之后主机名生效。 转载于…...

网站设计师工资一般多少/bt磁力种子

1、CQRS架构 上面图中包含有很多的概念&#xff0c;先列举一下所涉及的概念&#xff1a; Command Bus&#xff08;命令总线&#xff09;&#xff1a;在 Command Handler 之前&#xff0c;可以看作是 Command 发布者。Command Handler&#xff08;命令处理器&#xff09;&#…...