【问题标题】:Find Lowest Common Ancestor in a Nested Set在嵌套集中查找最低共同祖先
【发布时间】:2017-07-28 00:27:49
【问题描述】:

我正在寻找一种方法来找到嵌套集中的最低共同祖先,可以使用单个方程找到。

例如来自https://commons.wikimedia.org/wiki/File:Clothing-hierarchy-traversal.svg的图片

西装和女士之间的 LCA 是服装。我可以使用基于级别的系统来确定父级的会面位置,但这种情况的用例是在数据库设计中,因此提高级别会损害性能。

我希望我可以使用西装 (3:8) 和女士 (10:21) 的单一计算得出服装的组合 (1:22),前提是存在这样的等式。

【问题讨论】:

  • 这张图片看起来有点不对劲。根据这些数字,连衣裙和西装都应该有孩子。 Wikipedia 上嵌套集的页面具有相同层次结构的更新版本。 en.wikipedia.org/wiki/Nested_set_model

标签: nested-set-model lowest-common-ancestor


【解决方案1】:

嵌套集有一个有趣的属性,我们可以使用它来查找所有共同的祖先。该属性很简单,一个节点的所有子节点都有一个大于其左侧的左侧和一个小于其右侧的右侧。

这意味着我们需要找到具有左右边界的节点,其中包含我们关心的所有节点。我们可以通过使用我们关心的节点集来设置我们正在寻找的边界来做到这一点。我们可以很容易地做到这一点,如下所示:

取所有你想要一个共同祖先的节点的左下角和右上角。在这种情况下,您选择的节点的左下角是西服上的 3,而右下角是女式上的 21。然后,您可以在 3:21 的统一节点空间上执行祖先查询。

在这种情况下,您将寻找一组左 21 的节点。这将为您提供所有共同祖先的集合。在这种情况下,唯一的搭配就是衣服。衣服上的1小于3,22大于21。

如果您有多个共同的祖先,但您想要最低的,您可以按左列按降序对它们进行排序,然后取第一个。

这在 SQL 中可能看起来像这样。我正在使用 T-SQL,因此“前 1”可能是限制 1 或其他符合您 SQL 风格的东西。

select top 1 * from Clothing where [left] < 3 and [right] > 21 order by [left] desc

【讨论】:

  • 如此简单,却又精彩。
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多