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, ...
这是一个循环赛问题。
您可以使用循环方法让每个人在几个回合(槽位)中与团队中的任何其他成员(这是配对部分)进行比赛。
对于 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