尽管有很多关于生成排列的文章,但我对排列的算法需求有点不同。
给定一组元素(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开始是避免重复的最简单方法。
我试图找到Knuth的答案,但我对数学家来说太少了,无法在关于排列和组合的章节中给出的100左右这个特定的练习。它可能在那里,但不是我找到的。
希望有人在这里向我展示一个好的算法(最好用Pascal或C语言)。
答案 0 :(得分:2)
因为你的每一对都有2对子元素,所以我假设你的字符长度是偶数。
<强>算法强>
Python代码
这里我提供了在python中实现上述算法的代码:
# Keep coding and change the world..And do not forget anything..Not Again..
def func(chr_list, pair=""):
l = len(chr_list)
if l == 2:
print pair + '(' + chr_list[0] + chr_list[1] + ')'
else:
i = 0
l -= 1
ch1 = chr_list[0]
chr_list = chr_list[1:]
while i < l:
ch2 = chr_list[i]
chr_list.remove(ch2)
func(chr_list[:], pair + '(' + ch1 + ch2 + '), ')
chr_list.insert(i, ch2)
i += 1
func(['a', 'b', 'c', 'd', 'e', 'f'])
希望这会对你有所帮助。