在关联问题“生成所有唯一对置换”(here)中,给出了一种生成任意给定n的循环调度算法。也就是说,n团队的每一组可能的对决/配对。在
因此,对于n=4(假设为排除),则为:[0, 3], [1, 2]
[0, 2], [3, 1]
[0, 1], [2, 3]
现在我们有了这些分区,我们只需要找到它们的排列,就可以得到完整的配对列表。i、 e[0,3],[1,2]是四个组的成员:[0,3],[1,2](本身)和[3,0],[1,2]和[0,3],[2,1]和[3,0],[2,1]。在
要从一个成员中获取一个组的所有成员,可以使用置换,其中每个对可以翻转也可以不翻转(例如,如果它们是n元组而不是成对,那么就有n个!每个选项)。因为你有两个对和选项,每个分区产生2^2对。你一共有12个。在
执行此操作的代码,其中round\u robin(n)返回对列表的列表。所以循环(4)>;[[0,3],[1,2]],[[0,2],[3,1]],[[0,1],[2,3]]]。在
^{pr2}$
这个方法生成的数据比您想要的少,然后上升,而不是生成的比您想要的多,并且去掉一堆,所以它应该更有效。([::-1]是voodoo,用于不变地反转列表)。在
这是另一篇文章中的循环算法(由Theodros Zelleke撰写)from collections import deque
def round_robin_even(d, n):
for i in range(n - 1):
yield [[d[j], d[-j-1]] for j in range(n/2)]
d[0], d[-1] = d[-1], d[0]
d.rotate()
def round_robin_odd(d, n):
for i in range(n):
yield [[d[j], d[-j-1]] for j in range(n/2)]
d.rotate()
def round_robin(n):
d = deque(range(n))
if n % 2 == 0:
return list(round_robin_even(d, n))
else:
return list(round_robin_odd(d, n))