使插槽具有 1..N 范围内的唯一数字对

Nit*_*yal 0 python sorting algorithm logic

N位数字。假设N = 6

这定义了一个范围,从 1 开始:[1,2,3,4,5,6]

我需要创建它们唯一的对,以便范围中的每个数字仅与另一个数字配对一次。

例如,可用的对有:

(1,2),(1,3),(1,4),(1,5),(1,6),
(2,3),(2,4),(2,5),(2,6),
(3,4),(3,5),(3,6),
(4,5),(4,6),
(5,6)
Run Code Online (Sandbox Code Playgroud)

所以我们可以说,对于N的值,将有N*(N-1)/2对。

N = 6 时,总对数为 15。

现在,这些对需要放入槽中,这样一个槽只会使用数字一次。此外,任何一对都不能使用多次。

反例:

(1,2),(1,3),(1,4),(1,5),(1,6),
(2,3),(2,4),(2,5),(2,6),
(3,4),(3,5),(3,6),
(4,5),(4,6),
(5,6)
Run Code Online (Sandbox Code Playgroud)

总共有S个槽,其中S = N-1

这里,如果N = 6,则时隙数 = 6 - 1 = 5。

问题

我找不到创建此类插槽的模式。我正在为此寻找一种算法。如果可以编写代码,我更喜欢 Python。

到目前为止,认为N是偶数:6, 8, 12, ...

tri*_*cot 5

这是一个循环赛问题。

您可以使用循环方法让每个人在几个回合(槽位)中与团队中的任何其他成员(这是配对部分)进行比赛。

对于 n = 10,您可以查看这个蛇行表:

 1  2  3  4  5  
10  9  8  7  6  
Run Code Online (Sandbox Code Playgroud)

槽一对由以下列定义:(1, 10)、(2, 9)、(3, 8)、(4, 7)、(5, 6)

对于下一个槽,移动“圆圈”中的所有项目(1 除外):

 1 10  2  3  4  
 9  8  7  6  5  
Run Code Online (Sandbox Code Playgroud)

再次读出列中的对。

下一个插槽:

 1  9 10  2  3  
 8  7  6  5  4  
Run Code Online (Sandbox Code Playgroud)

...重复,直到回到第一个插槽的配置。

只要您始终如一地应用此圆圈移动,从哪种配置开始并不重要。只需将一个角值固定在适当的位置,而其他项目则从一个插槽绕到另一个插槽。

这是一个实现:

def getslots(n):
    for round in range(1, n):
        yield [(1, round + 1)] + [
              tuple(sorted(
                  ((top+round) % (n - 1) + 2, 
                  (n - 3 + round - top) % (n - 1) + 2)
               )) for top in range(n//2 - 1)]
Run Code Online (Sandbox Code Playgroud)

如果您不关心一对中两个数字的顺序,则可以省略tupleand调用。sorted