我的问题类似于this一个。
我有两个列表:X
包含n
元素,Y
包含m
元素 - 假设它们包含n x m
矩阵的行和列索引A
。现在,我想在矩阵k
中的A
随机位置写一些内容。
我想到了两个解决方案:
x
获取随机元素X
,从y
获取随机元素Y
。检查某些内容是否已写入A[x][y]
,如果没有 - 写入。但如果k
接近m*n
,我可以永远这样拍摄。m*n
数组,其中包含所有可能的索引组合,将其洗牌,绘制第一个k
元素并写入其中。但我在这里看到的问题是,如果n
和m
都非常大,则新创建的n*m
数组可能巨大(并且改组可能会占用一些时间也是如此。t
和:
if( k/(m*n) > t ){
use option 2.
}else{
use option 1.
}
有关如何挑选t
的任何建议吗?
我错过了其他(更好的)方法吗?
答案 0 :(得分:4)
有一个elegant algorithm归因于Floyd的抽样而没有从一系列整数中取代。您可以通过C ++函数$rootScope.$broadcast
将[0, n*m)
中的结果整数映射到坐标。
答案 1 :(得分:0)
最好的方法取决于你得到的矩阵有多满。如果你要填充超过一半的碰撞率(也就是已经“写入”的随机点)会很高并且会让你比你想要的更多地循环。
我不会产生所有可能性,但我会在你使用列表列表时构建它。一个用于X的所有可能值,并且从Y的可能值列表中开始。我将初始化X列表但不初始化Y列表。 每当你第一次选择x的值时,你创建一个字典或m个元素的列表,然后删除你使用的那个。然后下次你选择x你将有m-1个元素,一旦X值用完了元素,然后将其从列表中删除,这样它就不会被再次拾取..这样你就可以保证永远不会再次选择一个占用的空间,并且您不需要生成n * m个可能的选项。
答案 2 :(得分:0)
您有n x m
个元素,例如10 x 20
矩阵的200个元素。从200中挑选一个应该很容易。要点是,无论你做什么,你都可以将这两个维度平坦化为一个,从而减少问题的这一部分。
注意:
std::set
。对于黑名单,您只需要快速查找和快速插入,vector<bool>
可能实际上工作得很好。对于白名单,您需要快速随机访问和快速删除,其余索引vector<unsigned>
将是一个不错的选择。答案 3 :(得分:0)
对于nxm
矩阵,您可以考虑[0..n * m-1]矩阵元素的索引。
填写随机索引相当简单,只需生成0到n * m-1之间的随机数,这就是要填充的位置。
随后执行此操作可能会有点棘手:
示例:
vector<int> indexVec;
for (i=0;i<n*m;i++)
indexVec.push_back(i);
nrOfIndexes = n*m-1;
while (nrOfIndexes>1)
{
index = rand()% nrOfIndexes;
processMatrixLocation(index);
indexVec.erase(indexVec.begin()+index);
nrOfIndexes--;
}
processMatrixLocation(indexVec[0]);