Найдите самого младшего общего предка во вложенном наборе

Я ищу способ найти самого младшего общего предка во вложенном наборе, который можно найти с помощью одного уравнения.

введите здесь описание изображения

Например, из изображения по адресу: https://commons.wikimedia.org/wiki/File:Clothing-hierarchy-traversal.svg

LCA между костюмами и женской одеждой — это одежда. Я мог бы использовать систему, основанную на уровнях, чтобы выяснить, где встречаются родители, но вариант использования для этого находится в дизайне базы данных, поэтому повышение уровня будет пагубно для производительности.

Я надеюсь, что смогу использовать один расчет, используя Костюмы (3:8) и Женщины (10:21), чтобы получить комбинацию (1:22) для одежды, если такое уравнение существует.


person Flosculus    schedule 07.03.2017    source источник
comment
Это изображение выглядит немного не так. У платьев и костюмов должны быть дети в зависимости от этих чисел. На странице вложенных наборов в Википедии есть обновленная версия той же иерархии. en.wikipedia.org/wiki/Nested_set_model   -  person Devin    schedule 22.04.2017


Ответы (1)


У вложенных множеств есть интересное свойство, которое мы можем использовать для поиска всех общих предков. Свойство состоит просто в том, что все дочерние элементы узла имеют левый угол, который больше, чем его левый, И правый, который меньше, чем его правый.

Это означает, что нам нужно найти узлы, которые имеют левую и правую границу, содержащую ВСЕ интересующие нас узлы. Мы можем сделать это, используя наш набор узлов, которые нам нужны, чтобы установить границы, которые мы ищем. Мы можем сделать это довольно легко следующим образом:

Возьмите нижний левый и верхний правый из всех узлов, для которых вы хотите иметь общего предка. В этом случае нижний левый из выбранных вами узлов равен 3 для мастей, а самый верхний правый — 21 для женских. Затем вы можете выполнить запрос предков в этом едином пространстве узлов 3:21.

В этом случае вы должны искать набор узлов, где левое ‹ 3 и правое > 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
person Devin    schedule 21.04.2017
comment
Так просто, но гениально. - person Flosculus; 24.04.2017