无法在合理的运行时间内创建随机组

时间:2012-09-17 15:47:13

标签: performance math random

我有一个个人项目,我正在工作,我有一个我似乎无法解决的问题(好吧,我无法迅速解决)。

假设我有一群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。

2 个答案:

答案 0 :(得分:0)

你可以通过人物进行迭代,因为每个人都会将这个数字的y元素放在未满的随机组中。只有一个包含空组的数组,并在它们填满时删除它们,当然从随机选择中排除当前组。

答案 1 :(得分:0)

在数学术语中,您想要的是生成没有固定点的随机排列。这被称为这称为紊乱(参见here以获取更多细节,包括随机排列是紊乱的概率)。如果你谷歌“生成随机紊乱”或类似的东西,你会发现几个实现。