生成所有对的排列而不重复的算法

时间:2016-07-22 18:10:34

标签: algorithm double permutation

尽管有很多关于生成排列的文章,但我对排列的算法需求有点不同。

给定一组元素(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语言)。

1 个答案:

答案 0 :(得分:2)

因为你的每一对都有2对子元素,所以我假设你的字符长度是偶数。

<强>算法

  1. 获取列表中的第一个元素,并将其与列表中剩余的每个元素配对。
  2. 然后让每一对从列表中删除这两个元素,现在问题就缩小为一个列表,其中包含两个元素。
  3. 现在重复此过程,直到列表大小变为2。
  4. 现在这个是所需对的最后一对子。
  5. 你已经完成了。
  6. 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'])
    

    希望这会对你有所帮助。