首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Google S2 中的四叉树求 LCA 最近公共祖先

可以看到两者虽然 Level 是相同的,但是位置是不同的,为何会这样呢?原因就是之前说的,四叉树4个孩子,究竟选择哪一个,是由于父亲节点所在方向决定的。 1....查找父亲节点 在 Google S2 中,由于默认生成出来的 Cell 就是 Level 30 的,也就是 Level 最低的,位于树的最下层的叶子节点。...LCA 查找最近公共祖先 关于 CellID 的计算,还有很关键的一部分就是查找最近公共祖先的问题。问题背景:给定一棵四叉树中任意两个 Level 的 CellID ,如何查询两者的最近公共祖先。...由 CellID 的数据结构我们知道,想查找两个 Level 的最近公共祖先的问题可以转化为从左往右查找两个二进制串最长公共序列,最长的即是从根节点开始最远的公共祖先,也就是最近公共祖先。...查找过程中存在一个特殊情况,那就是要查找公共祖先的两个节点本身就在一个分支上,即其中一个 CellID 本来就是另外一个 CellID 的祖先,那么他们俩的公共祖先就直接是 CellID 大的那个。

15510

Google S2 中的四叉树求 LCA 最近公共祖先

查找父亲节点 在 Google S2 中,由于默认生成出来的 Cell 就是 Level 30 的,也就是 Level 最低的,位于树的最下层的叶子节点。...LCA 查找最近公共祖先 关于 CellID 的计算,还有很关键的一部分就是查找最近公共祖先的问题。问题背景:给定一棵四叉树中任意两个 Level 的 CellID ,如何查询两者的最近公共祖先。...由 CellID 的数据结构我们知道,想查找两个 Level 的最近公共祖先的问题可以转化为从左往右查找两个二进制串最长公共序列,最长的即是从根节点开始最远的公共祖先,也就是最近公共祖先。...查找过程中存在一个特殊情况,那就是要查找公共祖先的两个节点本身就在一个分支上,即其中一个 CellID 本来就是另外一个 CellID 的祖先,那么他们俩的公共祖先就直接是 CellID 大的那个。...---- 空间搜索系列文章: 如何理解 n 维空间和 n 维时空 高效的多维空间点索引算法 — Geohash 和 Google S2 Google S2 中的四叉树求 LCA 最近公共祖先 GitHub

92130
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    算法练习(14)-二叉树中2个节点的最近公共祖先?

    比如这颗树,给定2个节点: 4、5 ,它们的最近公共祖先节点为2。类似的,如果是3、5,它们的最近公共祖先节点为1。...1,求每个节点到根节点全路径的方法,在以前的文章算法练习(11)-二叉树的各种遍历 有详细代码,此处直接复用即可。...left : right; } 这个代码很短, 但不太好理解 , 先分析下一颗树中的2个节点X、Y,它们最近公共祖先的情况: 只会出现这2类情况: 1、节点X在Y的某1侧子树中(反过来也一样,...Y出现在X的某1侧子树中),即:1个节点就是另1个的最近公共祖先。...|| root == n2) //在左右子树遍历过程中,如果发现当前节点就是n1或n2,直接返回,因为下面的子节点,肯定不可能再是它俩的公共祖先节点了 ) {

    70610

    算法:二叉树中两个节点的最低公共祖先(LCA)

    思路要找到一个二叉树中两个节点的最低公共祖先(Lowest Common Ancestor, LCA),需要考虑以下几点:定义LCA:对于节点 A 和 B,它们的LCA是指在二叉树中同时作为 A 和 B...在 main 函数中,构造了一个二叉树,并找到了节点 5 和节点 1 的最低公共祖先。...复杂度分析在给定的解决方案中,时间复杂度是 O(n),其中 n 是二叉树中节点的数量。时间复杂度:在最坏情况下,递归函数 lowestCommonAncestor 可能会访问每个节点一次。...这是因为在最差情况下,需要遍历整棵树来查找给定的两个节点 p 和 q。因此,递归函数的时间复杂度为 O(n),其中 n 是树中节点的总数。...在最坏情况下,递归调用的空间复杂度为 O(n)。因此,整体来说,通过递归遍历二叉树来寻找两个节点的最低公共祖先的时间复杂度是 O(n),这保证了算法在合理的时间范围内解决问题,适用于一般大小的二叉树。

    22310

    二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))

    问题: 找到两个节点的二叉树的最近的共同祖先。...Tarjan算法非常精妙,可是使用了并查集,须要额外O(n)的存储空间。 上面博客中给的第三个方法也是须要记录根到节点的路径,须要O(log n)空间,当然考虑到普通情况下我们遍历树都是递归的方式。...所以本身方法调用栈就是O(log n)空间占用率。 可是这是对于平衡的二叉树而言的。在最差情况下空间占用率还是O(n)。 所以。这里我给的算法不须要记录根到节点的路径。并且只遍历树一遍就能够完毕。...否则,回退到上一层,这时二者的近期公共祖先也对应改成了p的父节点。由于以p为根的子树中没有发现另外一个节点q 4. 依此类推。找不到则继续回退到上一层,当找到q时,相应的二者近期公共祖先也就找到了。...若是p==q,直接返回p作为近期公共祖先 6. 若二者不都存在于树中,则返回空。

    25610

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。...百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。...如何时间复杂度O(N),额外空间复杂度O(1),解决最低公共祖先问题? 力扣236。二叉树的最近公共祖先。 答案2022-05-22: 莫里斯遍历。 答案用rust编写,答案有误。...binary tree node. type TreeNode struct { val int left *TreeNode right *TreeNode } // 提交以下的方法...// 该方法亮点在于:时间复杂度O(N),额外空间复杂度O(1) func lowestCommonAncestor(head, o1, o2 *TreeNode) *TreeNode { if

    41820

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。...百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。...如何时间复杂度O(N),额外空间复杂度O(1),解决最低公共祖先问题? 力扣236。二叉树的最近公共祖先。 答案2022-05-22: 莫里斯遍历。 答案用rust编写,答案有误。...for a binary tree node. type TreeNode struct { val int left *TreeNode right *TreeNode } // 提交以下的方法...// 该方法亮点在于:时间复杂度O(N),额外空间复杂度O(1) func lowestCommonAncestor(head, o1, o2 *TreeNode) *TreeNode { if findFirst

    42610

    如何用Python在豆瓣中获取自己喜欢的TOP N电影信息

    功能健全,能满足我们工作中绝大多数需求的开发 通用语言,几乎可以用在任何领域和场合,可以跨平台使用,目前各 Linux系统都默认安装 Python 运行环境 社区,是否有一个完善的生态系统 pypi,...Web 编程 图形处理、多媒体应用 文本处理(爬虫) 数学处理(数据分析、机器学习) 网络编程 游戏开发 黑客( POC 脚本、木马) 自动化测试 运维开发 云计算 五、什么是爬虫 按照一定规则自动的获取互联网上的信息...,进行金融交易) Web扫描(需要对网站所有的网页进行漏洞扫描) 获取某网站最新文章收藏 爬取天气预报 爬取漂亮mm照片 给空间朋友点赞 .........六、实战项目 1、项目目标 目标:在豆瓣中获取自己喜欢的TOP N电影信息 2、基础知识 HTTP 协议 客户端发起请求,服务器接收到请求后返回格式化的数据,客户端接收、解析并处理数据 HTML(超文本标记语言...6、获取电影详情 7、写入csv文件 如何学习 Python 多抄、多写、多想、多问、多看、多听、多说 学习编程是为了解决实际的问题,把自己在工作或学习中的重复工作程序化 谷歌和度娘

    1.7K61

    机器学习(31)之频繁集挖掘FP Tree详解

    如图2所示,现有10条数据,首先第一次扫描数据并对1项集计数,发现O,I,L,J,P,M, N都只出现一次,支持度低于20%的阈值,因此他们不会出现在下面的项头表中。...开始时FP树没有数据,建立FP树时我们一条条的读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。...如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。...2)扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。 3)读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。...如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。

    1.3K60

    FP Tree算法原理总结

    我们有10条数据,首先第一次扫描数据并对1项集计数,我们发现F,O,I,L,J,P,M, N都只出现一次,支持度低于20%的阈值,因此他们不会出现在下面的项头表中。...开始时FP树没有数据,建立FP树时我们一条条的读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。...如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。     ...2)扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。     3)读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。...如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。

    2.2K51

    【Leetcode】二叉树的最近公共祖先,二叉搜索树转换成排好序的双向链表,前序遍历与中序遍历构造二叉树

    一.二叉树的最近公共祖先 链接 二叉树的最近公共祖先 题目再现 『Ⅰ』思路一:转换成相交链表问题 观察上图,节点1和节点4的最近公共祖先是3,这是不是很像相交链表的问题,关于相交链表,曾经我在另一篇文章里写到过...} return ppath.top(); } }; 可以看到,这种方法效率使非常高的,它的时间复杂度是O(N); 『Ⅲ』思路三:暴力查找 其实当两个节点分别在左树和右树时,...它们最近的公共祖先就是根节点,如果不在树两边,而是都在左树,或是都在右树,那么就可以转化成子问题,递归解决。...如下图: 注意,如果有一个节点恰好是根节点,那么这个节点就是最近的公共祖先,也是说一个节点的祖先也算它自己。 如下图: 那么该怎么判断节点是在左树还是右树呢?...head; } }; 三.根据一棵树的前序遍历与中序遍历构造二叉树 链接 根据一棵树的前序序列与中序序列构建二叉树 题目再现 解法 众所周知,前序遍历的顺序为:根 左 右 中序遍历的顺序为

    17510

    疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree

    4.定义基尔霍夫矩阵J为度数矩阵D-邻接矩阵C,即J=D-C; 5.G图生成树的数量为任意矩阵J的N-1阶主子式的行列式的绝对值。...首先明确一点就是若图G是一颗树,他的基尔霍夫矩阵的N-1阶行列式的值1;因为是一棵树,所以不含有环,且两点之间就只有一条边相连,任意列任意行只有1,且度数矩阵与之对应密切,一个点的度数只和自己的变数有关...,且不与其他边相连,度数和为2*N,边数为N,且能通过高斯消元化为上三角行列式 ?...,即讨论J矩阵中能够构成多少个该子树,即为求矩阵N-1阶主子式的行列式,注意任意一个图的J基尔霍夫矩阵的行列式值都为0; 实现方式: 就是求这个行列,行列式求得方法是高斯消元,其实就是将行列式化为上三角行列式...; for(i=0;in;i++) b[i]=i; for(i=0;in;i++){ if(zero(a[b[i]][i])) for(j=i+1;jn;j++) if(!

    54120

    LCA详解_lca软件

    LCA问题(least Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u,v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找到一个节点...下面我们依次介绍一下: (一):一般解法 根据树的结构,树中除根节点外的每个节点有且只有一个父节点,所以我们可以记录好每一个节点的父节点,这样我们能够根据父节点的父节点,一次来遍历到每个节点的所有祖先节点...为了方便找到第一个祖先,我们可以维持一个数组depth[n],因为它俩的祖先一定是深度相同的节点(同一个节点嘛,所以深度肯定相同),所以我们可以先将深度较大的节点u向上查找,找到它的某个祖先s,使得这个...start:深度遍历的起始节点 l:树中节点的个数 deep:当前遍历的节点在树中的深度 */ void dfs(int** ntree,int start,int l,int deep){...//树中节点的个数 int ancestor[105]; //已访问节点集合的祖先 void initSet(){ for(int i=0;in;

    51330

    离线Tarjan算法-最近公共祖先问题

    转载自Tarjan算法 LCA问题(Least Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两个顶点u和...一个LCA的例子如下。比如节点1和6的LCA为0。 二 算法思路 Tarjan算法是离线算法,基于后序DFS(深度优先搜索)和并查集。如果不熟悉并查集,可以查看并查集及其在最小生成树中的应用。...比如上面的例子中,前面处理的节点的顺序为4->7->5->1->0->…。 当访问完4之后,集合{4}跟集合{1}合并,得到{1,4},并且集合祖先为1。然后访问7。...> tree[mx]; //树的邻接表(不一定是二叉树) void inputTree() //输入树 { scanf("%d", &n); //树的顶点数 for (int i = 0; i n; i++) //初始化树,顶点编号从0开始 tree[i].clear(), indeg[i] = 0; for (int i = 1; i n; i++) //输入n-1条树边 {

    1.8K51

    杂七杂八的练习(2)

    输入描述: 输入为两行,第一行为N,代表非负整数的个数,第二行为N个非负整数。 2、算法思路 算法从第一层开始计数,将每层积累的雨水数累加起来。...一对兔子的祖先是这对兔子以及他们父母(如果有的话)的祖先,而最近公共祖先是指两对兔子所共有的祖先中,离他们的距离之和最近的一对兔子。...当月出生的兔子的祖先从1递增,如:6~8号兔子是同一个月出生的,它们的祖先依次为1、2、3;9~13号兔子是同一个月出生的,它们的祖先依次为1、2、3、4、5。...火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。 一个火星人用一个人类的手演示了如何用手指计数。...输入样例 : ssuuusuluu 输出样例 : 14 2、算法思路 构造哈夫曼树实现即可,不过构造之后需要依次读取字符结点的父结点,得到编码长度再做计算。

    82120

    查并集及优化

    Ok,其实上面说的这种算法思想就是查并集,其标准的描述也是通过树和森林来定义的:在一个森林中有很多棵不同的树,我们通过一些信息来将一些不同的分开的树合并成一棵大的树。...在这道题目中,一开始森林中有 7 棵不同根节点的树,树的根节点在这道题目中就相当于“朋友祖先”(7 个朋友圈,每个朋友圈中只有一个人,即为他自己,也是每个朋友圈的“朋友祖先”),通过题中所给的信息不断合并朋友圈...(合并森林中不同的树),合并结束之后森林中树的棵树或者不同的树的根节点的个数(“朋友祖先”的个数)就是朋友圈的个数。...此时再查找下标为 4 的人所在的朋友圈就只需要向上递归 2 次就可以了。那么我们应该如何确定合并朋友圈的方式呢?可能到这里你已经想到了:将高度较小的那一个朋友圈作为子圈合并到高度较大的朋友圈。...那么我们怎么获取每个朋友圈的高度呢?我们可以用一个数组来保存每个朋友圈的高度,在合并的时候比较两个朋友圈的高度来确定合并方式,合并完成之后调整一下合并后的朋友圈高度。

    69020

    【已解决】怎么获取字符串中相同字符串第N 个所在的位置

    问题描述 给一个配置的字符串例如 NSString *string = @"34563879-+4561346573"; 现在我想获取到字符串第3个字符串3所在的位置。...对于我们经常用的rangeOfString这个方法只能获取最近的一次出现的位置,而不能指定第几个出现的位置。 查看关于 NSString里面其他不经常用到的 API,还真找到一个相似的方法。...2, //逐字节比较 区分大小写 NSBackwardsSearch = 4, //从字符串末尾开始搜索 NSAnchoredSearch = 8, //搜索限制范围的字符串...NSNumericSearch = 64, //按照字符串里的数字为依据,算出顺序。...使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch }; rangeOfReceiverToSearch 需要搜索在源字符串所在的范围

    2.5K20

    文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题

    在二叉搜索树中,每个节点的左子树中的所有元素的值都小于该节点的值,而右子树中的所有元素的值都大于该节点的值。 由于二叉搜索树的节点值互不相同,我们可以根据值的大小来定位一个节点在树中的位置。...首先,考虑初始情况,即二叉搜索树T只有一个结点x。由于x没有右子树,所以它的后继y不存在。因此,初始情况下命题成立。 接下来,假设对于任意包含n个结点(n≥1)的二叉搜索树T,命题都成立。...我们需要证明对于包含n+1个结点的二叉搜索树T',命题也成立。 考虑T'中的结点x。如果x没有右子树,那么根据题意,x没有后继,命题仍然成立。 现在假设x有右子树,并且x的后继为y。...由于T是二叉搜索树,所有在x右子树中的结点的键值都大于x的键值,因此y一定位于x右子树中的某个位置。 1. 如果y是x的右孩子,那么y一定是x的最底层祖先,并且其左孩子也是x的祖先,命题成立。 2....根据二叉搜索树的性质,y的左子树中的所有结点的键值都小于y的键值,并且都大于x的键值。因此,y的左子树中的结点都是x的祖先。

    24720
    领券