如何从NumPy数组生成无重复配对矩阵(联赛赛程场景)
联赛赛程编排的NumPy数组实现
已知NumPy数组:
A = np.arange(1,11)
需生成数组B,满足以下要求:
- B包含
n = len(A)-1个元素(对应n轮比赛) - 每个元素由
m = len(A)/2个配对组成(每轮的对阵组合) - B中任意两个不同元素内的配对完全唯一,无重复对阵
小规模示例验证
当输入 A = np.array([1,2,3,4]) 时,输出应为:
B = np.array([[[1,2],[3,4]], [[1,3],[2,4]], [[1,4],[2,3]]])
解决方案代码
import numpy as np def generate_league_schedule(players): num_players = len(players) # 仅处理偶数人数场景(符合题目需求) assert num_players % 2 == 0, "参赛人数需为偶数" num_rounds = num_players - 1 num_matches_per_round = num_players // 2 schedule = [] # 固定第一个选手,其余选手按规则轮转 fixed_player = players[0] rotating_players = players[1:].tolist() for _ in range(num_rounds): # 生成当前轮对阵:固定选手配对轮转列表首元素,首尾依次配对剩余选手 current_round = [[fixed_player, rotating_players[0]]] for i in range(1, num_matches_per_round): current_round.append([rotating_players[i], rotating_players[-i]]) schedule.append(current_round) # 轮转操作:将最后一名选手移到第二位,为下一轮做准备 rotating_players.insert(1, rotating_players.pop()) return np.array(schedule) # 测试小规模输入 A_small = np.array([1,2,3,4]) B_small = generate_league_schedule(A_small) print("小规模示例输出:") print(B_small) # 测试10人参赛场景 A = np.arange(1,11) B = generate_league_schedule(A) print("\n10人赛程输出:") print(B)
逻辑说明
核心采用固定轮转法实现单循环赛制编排:
- 固定一名选手,其余选手按规则轮转,确保每一轮的对阵组合无重复
- 每轮配对时,固定选手与轮转列表首元素配对,剩余选手从首尾依次取数配对,保证每轮凑齐规定数量的对阵
- 每轮结束后调整轮转列表顺序,生成下一轮的对阵基础,最终恰好生成
len(A)-1轮完整赛程
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

