Вы можете смоделировать эту проблему как проблему с графиком и обойти весь имеющийся набор данных, используя либо DFS (поиск в глубину), либо BFS (поиск в ширину).Во время обхода вы можете назначить номер компонента каждому дереву в лесу данных, которые вы исследуете, и в результате вы можете найти все подключенные компоненты этого график данных у вас есть.Затем для каждого связанного компонента вы можете просто сформировать группы из 2, используя его членов, и использовать их для описания отношения.Если существует нечетное количество элементов, вы можете выбрать уже использованный элемент и связать его с последним оставшимся.
Это, очевидно, предполагает, что ваша цель - найти только подключенные компоненты, а не печатать отношения , как вы выразились, определенным образом.Например, если вы пытаетесь напечатать links так, чтобы максимальное расстояние между элементами было минимально возможным, проблема становится гораздо более сложной.
Другой подход, который разделяетто же самое предположение, которое я упомянул выше, будет состоять в использовании метода union-find, также известного как структура данных, называемая несвязанным множеством.Вы можете начать с N наборов, которые имеют N из ваших предметов.Затем при прохождении этих отношений для каждого отношения (x, y)
вы объединяете множества, содержащие элементы x
и y
.В конце все подключенные компоненты будут в одном наборе.
Первый подход имеет O(V + E)
сложность времени, V
и E
- количество элементов и отношений в ваших данных, соответственно,Второй подход имеет O(V + E . k(V))
сложность времени, где k - это функция, называемая Inverse Ackermann, которая увеличивается очень медленно.(т.е. даже медленнее, чем логарифмическая функция)