У меня есть список наборов (a, b, c, d, e в примере ниже). Каждый из наборов содержит список узлов в этом наборе (1-6 ниже). Мне было интересно, что, вероятно, существует общеизвестный алгоритм для достижения ниже, и я просто не знаю об этом.
sets[
a[1,2,5,6],
b[1,4,5],
c[1,2,5],
d[2,5],
e[1,6],
]
Я хотел бы сгенерировать новую структуру, список групп, каждая из которых имеет
- все (под) наборы узлов, которые появляются в нескольких наборах
- ссылки на исходные наборы, к которым принадлежат эти узлы
Таким образом, приведенные выше данные станут (порядок групп не имеет значения).
group1{nodes[2,5],sets[a,c,e]}
group2{nodes[1,2,5],sets[a,c]}
group3{nodes[1,6],sets[a,e]}
group4{nodes[1,5],sets[a,b,c]}
Я предполагаю, что могу получить данные в виде структуры массива / объекта и манипулировать ими, а затем выплюнуть полученную структуру в любом необходимом формате.
Было бы плюсом, если:
- все группы имели минимум 2 узла и 2 комплекта.
- когда подмножество узлов содержится в большем наборе, которое образует группу, тогда только больший набор получает группу: в этом примере узлы 1,2 не имеют собственной группы, поскольку все наборы, которые они имеют общие уже появляются в group2.
(Наборы хранятся в XML, который мне также удалось преобразовать в JSON, но это не имеет значения. Я могу понять процедурный (псевдо) код, но также что-то вроде скелета в XSLT или Scala может помочь получить началось, наверное.)