慕森王
您所说的“最大化平均分配”是什么意思没有明确定义。人们可能会考虑给定值的两个幻影之间的最大对数。我将留给你展示我在这里给出的方法相对于它是如何执行的。对于 n 个对象,我们有 n*(n-1) 对。在这些(a, b)对中:n 具有诸如 b = (a+1) modulo n 之类的索引n 具有诸如 b = (a+2) modulo n 之类的索引等等。我们可以生成前 n 对相差 1,然后生成 n 对相差 2...对于每个差异,我们通过将差异添加到索引(模 n)来生成索引。当我们得到a已经用于这种差异的an 时,我们加 1(再次取模 n)。这样,我们可以生成具有这种差异的 n 对。当我们“滚动”索引时,我们确信每个值都会定期出现。def pairs(n): for diff in range(1, n): starts_seen = set() index = 0 for i in range(n): pair = [index] starts_seen.add(index) index = (index+diff) % n pair.append(index) yield pair index = (index+diff) % n if index in starts_seen: index = (index+1) % n pairs2 = list(pair for pair in pairs(2))print(pairs2)# [[0, 1], [1, 0]] pairs3 = list(pair for pair in pairs(3))print(pairs3) # [[0, 1], [2, 0], [1, 2], # [0, 2], [1, 0], [2, 1]]pairs4 = list(pair for pair in pairs(4))print(pairs4) # [[0, 1], [2, 3], [1, 2], [3, 0], <- diff = 1# [0, 2], [1, 3], [2, 0], [3, 1], <- diff = 2# [0, 3], [2, 1], [1, 0], [3, 2]] <- diff = 3pairs5 = list(pair for pair in pairs(5))print(pairs5) # [[0, 1], [2, 3], [4, 0], [1, 2], [3, 4],# [0, 2], [4, 1], [3, 0], [2, 4], [1, 3],# [0, 3], [1, 4], [2, 0], [3, 1], [4, 2],# [0, 4], [3, 2], [1, 0], [4, 3], [2, 1]]# A check to verify that we get the right number of different pairs:for n in range(100): pairs_n = set([tuple(pair) for pair in pairs(n)]) assert len(pairs_n) == n*(n-1)print('ok')# ok