我想分享一种循环调度的不同实现,该实现利用
deque了标准库中的-data结构:
from collections import dequedef 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))print round_robin(5) [[[0, 4], [1, 3]], [[4, 3], [0, 2]], [[3, 2], [4, 1]], [[2, 1], [3, 0]], [[1, 0], [2, 4]]]print round_robin(2) [[[0, 1]]]
它将对象(此处为int)放入双端队列。然后旋转并构建从两端到中间的连续对。可以想象这是将中间的双端队列折叠回去。明确说明:
大小写不均元素 :
round 1 round 2 # pairs are those numbers that sit---------- --------- # on top of each other0 1 2 3 4 8 0 1 2 38 7 6 5 7 6 5 4
在偶数元素的情况下,需要额外的步骤。
(我错过了第一次,因为我只检查了不均匀的情况。这产生了一个非常错误的算法……这向我展示了在实现算法时检查边缘情况的重要性……)
这一特殊步骤是我交换了每次旋转之前,两个最左边的元素(即双端队列的第一个和最后一个元素)-这表示
0一直保持在左上方。
大小写甚至元素:
round 1 round 2 # pairs are those numbers that sit---------- --------- # on top of each other0 1 2 3 0 7 1 27 6 5 4 6 5 4 3
关于此版本,困扰我的是代码重复的数量,但是在保持可读性的同时,我找不到改善的方法。这是我的第一个实现,IMO的可读性较差:
def round_robin(n): is_even = (n % 2 == 0) schedule = [] d = deque(range(n)) for i in range(2 * ((n - 1) / 2) + 1): schedule.append( [[d[j], d[-j-1]] for j in range(n/2)]) if is_even: d[0], d[-1] = d[-1], d[0] d.rotate() return schedule
更新以说明更新的问题:
为了在不平衡的情况下允许三人一组,您只需要更改
round_robin_odd(d, n):
def round_robin_odd(d, n): for i in range(n): h = [[d[j], d[-j-1]] for j in range(n/2)] h[-1].append(d[n/2]) yield h d.rotate()
这给出:
print round_robin(5)[[[0, 4], [1, 3, 2]], [[4, 3], [0, 2, 1]], [[3, 2], [4, 1, 0]], [[2, 1], [3, 0, 4]], [[1, 0], [2, 4, 3]]]



