Я ищу алгоритм, который может находить / назначать порядок и перекрываться, учитывая список упорядоченных элементов и список неупорядоченных элементов. (из которых перекрытие может существовать или не существовать).
В этом примере я буду использовать целые числа, но они также могут быть именами людей, идентификационными кодами и т. Д. То есть число не может быть использовано для решения реальной проблемы, но для объяснения проблемы я использовал упорядоченный набор (1,2,3,4,5,6,7,8,9,10) как ответ Святого Грааля.
Введите:
Упорядоченный список списков: (1,2,3,4), (8,9,10), (3,4,5)
Неупорядоченный список списков: (3,4,2), (6,4,5,7), (10,9)
Мысленный процесс, как я делаю этот алгоритм в моей голове:
- списки 3,4,5 и 1,2,3,4 упорядочены и имеют 3,4 общих, поэтому 2 упорядоченных списка пересекаются, образуя: 1,2,3,4,5 в этом порядке.
- Неупорядоченный список 3,4,2 является подмножеством упорядоченного списка 1,2,3,4,5, поэтому его можно изменить на 2,3,4 и сказать, что он перекрывает упорядоченный список 1,2,3, 4,5
- Та же идея (как в шаге 2) для упорядоченного списка 8,9,10 по сравнению с неупорядоченным 10,9. Это должно быть 9,10 с 8,9,10.
- Теперь сравнивая упорядоченный список 1,2,3,4,5 и неупорядоченный 6,4,5,7, они имеют набор пересечений 4,5, поэтому можно сделать вывод, что его 1,2,3,4,5 , (6,7 | 7,6) где (6,7 | 7,6) означает, что либо 6, либо 7, либо 7, а затем 6 (но неизвестно, что верно)
Выход:
- Я хотел бы иметь возможность проанализировать матрицу / дерево / любую структуру данных, чтобы увидеть, что перекрывается, где и в каком порядке
- и сводный список, содержащий наборы частично известного порядка
- set1: 1,2,3,4,5, (6,7 | 7,6)
- set2: 2: 8,9,10
Кто-нибудь знает похожую проблему или алгоритм, который я мог бы использовать? В идеале это было бы на Perl, но псевдокод или алгоритмы на другом языке были бы хороши.
Спасибо