3

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

在此处输入图像描述

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

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

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

4

1 回答 1

3

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

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

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

在这种情况下,您将查找 left < 3 和 right > 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
于 2017-04-21T22:43:55.903 回答