在嵌套集中查找最低共同祖先

时间:2017-03-07 17:19:13

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

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

enter image description here

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

的图片

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

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

1 个答案:

答案 0 :(得分:2)

嵌套集有一个有趣的属性,我们可以用它来查找所有常见的祖先。该属性只是一个节点的所有子节点都有一个大于它左边的左边和一个小于它右边的右边。

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

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

在这种情况下,您要查找一组左侧< 3和右>那会给你一套所有共同的祖先。在这种情况下,唯一的匹配是服装。衣服上的1小于3,22大于21。

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

这可能在SQL中看起来像这样。我正在使用T-SQL,所以" top 1"您的SQL风格可能会限制1或其他内容。

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