我有一个个人项目,我正在工作,我有一个我似乎无法解决的问题(好吧,我无法迅速解决)。
假设我有一群x[1..|x|]
人和一组x
元素。
我想创建x组(组号i
适用于人员编号i
),并且每组中都有y
个不同的元素。
例如:如果我有10个人和10个元素,我希望每个组都有2个元素:
| 0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |
|___________________________________________|
| 7 |4 |0 |6 |2 |8 |3 |1 |9 |5 |
| 6 |9 |5 |8 |7 |0 |2 |3 |1 |4 |
第一行代表人(0..9)
;
每个人下面的两个数字表示他拥有哪些元素
注意:每个元素只出现两次(不多也不少)
另请注意,人员编号i
不能包含元素编号i
例如:人员编号3不能包含元素编号3。
我的问题是如何创建这些组(快速)
到目前为止,我找到的最佳解决方案是创建一个包含x
列和y
行的矩阵;
取一个大小为x
的数组,将其混洗,然后查看是否无法将其插入矩阵。如果可以的话,转到下一行;如果我不能再次洗牌,看看现在是否可以插入。
问题是,即使数量很少(1000个人/元素,每组50个元素),代码也很慢。
问题在于shuffle,当它试图找到一个匹配行(~13)时,它需要多次重新洗牌,直到它找到一个可以放在矩阵内的行。
有谁知道如何快速完成这件事?任何想法都会受到欢迎!!
THX。
答案 0 :(得分:0)
你可以通过人物进行迭代,因为每个人都会将这个数字的y元素放在未满的随机组中。只有一个包含空组的数组,并在它们填满时删除它们,当然从随机选择中排除当前组。
答案 1 :(得分:0)
在数学术语中,您想要的是生成没有固定点的随机排列。这被称为这称为紊乱(参见here以获取更多细节,包括随机排列是紊乱的概率)。如果你谷歌“生成随机紊乱”或类似的东西,你会发现几个实现。