Хотя есть множество статей о генерации перестановок, у меня есть алгоритмическая потребность в перестановке, которая немного отличается.Алгоритм генерации всех перестановок пар без повторения
Для набора элементов (a, b, c, .. n) Я строю пары: (ab), (cd), (ef), ... в любой комбинации элементов. Пары (ab) и (ba) идентичны. Также необходимые перестановки не должны различаться только в последовательности: (ab), (ef), (cd) идентична (ef), (cd), (ab)
В качестве примера я покажу исчерпывающий список перестановок для 6 элементов a, b, c, d, e, f.
Это список пар Я хотел бы, чтобы алгоритм генерации:
(ab), (cd), (ef)
(ab), (ce), (df)
(ab), (cf), (de)
(ac), (bd), (ef)
(ac), (be), (df)
(ac), (bf), (de)
(ad), (bc), (ef)
(ad), (be), (cf)
(ad), (bf), (ce)
(ae), (bc), (df)
(ae), (bd), (cf)
(ae), (bf), (cd)
(af), (bc), (de)
(af), (bd), (ce)
(af), (be), (cd)
Я пытался представить себе алгоритм для 4 пар (8 элементов), но я не мог.
Типичным для решения является то, что все линии начинаются с элемента a. Любой другой исходный элемент может привести к конфликту с двумя правилами: (ab) равно (ba) и (cd), (ab) равно (ab), (cd). Таким образом, начинать все с элемента a является самым простым способом избежать дубликатов.
Я попытался найти ответ с Кнутом, но я слишком маленький математик, чтобы иметь возможность найти это конкретное упражнение в 100 или около того, данное в главе о перестановках и комбинациях. Вероятно, там, но не для меня.
Надежда, что кто-то здесь может показать мне хороший алгоритм (желательно на Паскале или в C).
http://stackoverflow.com/questions/32493769/sets-of-all-disjoint-pairs/32494810#32494810 – MBo
Объедините первый элемент со всеми вытекающими за ним элементами (используя цикл), затем для каждой пары (a, x) рекурсия с остальной частью набора – m69