给定多个二叉树,更本地化、更高效的最低公共祖先算法?

2023-12-31

我有多个二叉树存储为数组。每个槽中要么是 nil(或 null;选择您的语言),要么是存储两个数字的固定元组:两个“子项”的索引。任何节点都不会只有一个子节点——要么没有,要么有两个。

将每个槽视为一个二进制节点,仅存储指向其子节点的指针,并且没有固有值。

以这个二叉树系统为例:



    0       1
   / \     / \
  2   3   4   5
 / \         / \
6   7       8   9
   / \
 10   11
  

关联的数组将是:

   0       1       2      3     4      5      6      7        8     9     10    11
[ [2,3] , [4,5] , [6,7] , nil , nil , [8,9] , nil , [10,11] , nil , nil , nil , nil ]

我已经编写了简单的函数来查找节点的直接父节点(只需从前面搜索直到存在包含子节点的节点)

此外,假设在相关时间,所有树的深度都在几层到几千层之间。

我想找一个函数

P(m,n)

找到 m 和 n 的最低共同祖先——更正式地说,LCA 被定义为“最低”或最深的节点,其中 m 和 n 作为后代(子代或子代的子代等)。如果没有,则 nil 将是有效返回。

给定我们给定的树的一些示例:

P( 6,11)   # => 2
P( 3,10)   # => 0
P( 8, 6)   # => nil
P( 2,11)   # => 2

我能找到的主要方法是使用欧拉迹,它将给定的树(添加节点 A 作为 0 和 1 的不可见父节点,“值”为 -1)转换为:

A-0-2-6-2-7-10-7-11-7-2-0-3-0-A-1-4-1-5-8-5-9-5-1-A

由此,只需找到给定的 m 和 n 之间编号最小的节点即可;例如,要查找 P(6,11),请在迹线上查找 6 和 11。它们之间最小的数字是 2,这就是你的答案。如果 A (-1) 位于它们之间,则返回 nil。

 -- Calculating P(6,11) --

A-0-2-6-2-7-10-7-11-7-2-0-3-0-A-1-4-1-5-8-5-9-5-1-A
      ^ ^        ^
      | |        |
      m lowest   n

不幸的是,我确实相信找到一棵树的欧拉迹可以几千深度的层次对机器来说有点繁重……而且因为我的树在整个编程过程中不断变化,每次我想找到 LCA 时,我都必须重新计算欧拉迹并保存它每次都在记忆中。

考虑到我正在使用的框架,是否有更有效的内存方法?一个可能向上迭代的?我能想到的一种方法是“计算”两个节点的生成/深度,并爬升最低节点直到它与最高节点的深度匹配,并增加两者直到找到类似的节点。

但这需要从 3025 级上升到 0 级,twice,计算一代,并首先使用效率极低的爬升算法,然后重新爬回来。

还有其他更好的方法吗?


澄清

在这个系统的构建方式中,每个孩子的数字都会比他们的父母大.

这确实not保证如果 n 在第 X 代中,则第 (X-1) 代中没有大于 n 的节点。例如:



        0
       / \
      /   \
     /     \
    1       2        6
   / \     / \      / \
  2   3   9  10    7   8
     / \              / \
    4   5            11 12
  

是一个有效的树系统。

此外,树的构建方式的一个缺陷是同一父代的两个直接子代将始终连续编号。


节点的顺序是否像您的示例中那样,子级的 id 大于父级?如果是这样,您也许可以执行类似于合并排序的操作来找到它们。对于您的示例,6 和 11 的父树是:

6  -> 2 -> 0
11 -> 7 -> 2 -> 0

所以也许算法是:

left = left_start
right = right_start

while left > 0 and right > 0
    if left = right
        return left
    else if left > right
        left = parent(left)
    else
        right = parent(right)

它将运行为:

left    right
----    -----
 6        11    (right -> 7)
 6        7     (right -> 2)
 6        2     (left -> 2)
 2        2     (return 2)

它是否正确?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定多个二叉树,更本地化、更高效的最低公共祖先算法? 的相关文章

  • 找到质数?

    为了判断 N 是否是质数 我们只需要查找所有小于或等于 sqrt N 的数字 这是为什么 我正在编写 C 代码 因此试图理解其背后的原因 如果 N 是一个正整数 且能被两个正整数 1 和 N 整除 则 N 是素数 由于数字的约数不能大于该数
  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • 对矩阵进行舍入,保留行和列总计

    想要 以保留行和列总计的方式对矩阵进行舍入的 伪 代码 问题从向量开始 X and Y of 非负整数 with Sum X Sum Y 想要圆X Y Sum X 同时保留行和列总计 这是婚姻问题的一种 Xa需要进行一定次数的握手 拨打该号
  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • 直观地执行不同的排序算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • Google 文档如何处理编辑冲突?

    我一直在尝试编写自己的 Javascript 编辑器 其功能类似于 Google Docs 允许多人同时使用 我不明白一件事 假设用户 A 和用户 B 直接相互连接 网络延迟为 10 毫秒 我假设编辑器使用 diff 系统 据我了解 Doc
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • Python 旅行商贪婪算法 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 因此 我为旅行推销员问题创建了一种排序 并按 x 坐标和 y 坐标进行排序 我正在尝试实施贪婪搜索 但无法做到 此外 每
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 在一个区域中拟合二维多边形的算法?

    这有标准吗 算法名称 说 我有 10 个不同大小的多边形 我有一个特定大小的区域 我想知道如何填充该区域中的最多多边形 以及它们是如何拟合的 笔记 多边形可以根据限制集进行旋转 一个可能的名称是包装问题 http en wikipedia

随机推荐