从网格中随机选择一个单元格并标记,直到出现某种情况

时间:2013-08-31 19:55:11

标签: algorithm matrix shuffle

我有NxN布尔矩阵,其所有元素都具有初始状态false

bool[][] matrix = GetMatrix(N);

在循环的每个步骤中,我想在所有row i, column j个单元格中随机均匀地选择一个单元格(false),并将其设置为true,直到出现某种情况。< / p>

使用哪种方法?我有两种方法。

  • NxN创建一个0...(NxN-1)数组,使用统一混洗算法进行随机播放,然后从该数组中依次取i元素并设置矩阵[i / N] [i%N]。

使用O(N^2)额外内存,初始化需要O(N^2)时间

第二次

  • i生成随机0...(N^2-1),如果(i / N,i%N)在矩阵中设置,则重复随机生成,直到找到未设置的元素。

这种方式不使用任何额外的内存,但我很难估计性能......可能是一个案例,当除了一个元素之外的所有元素都被设置,并且随机重复很多次寻找空闲单元格?我是对的,一旦理论上随机一致地工作,这种情况不应该经常发生吗?

2 个答案:

答案 0 :(得分:1)

  

从0 ...(N ^ 2-1)生成随机i,如果(i / N,i%N)在矩阵中设置,   重复随机生成,直到创建未设置的元素。

该算法的分析与coupon collector's problem相同。运行时间是Theta(n ^ 2 log n)。

答案 1 :(得分:1)

我会尝试回答你的问题,最糟糕的情况是分析,正如你所指出的那样,除了一个细胞之外的所有细胞都会被采取。

让我们首先注意p = P(X = m) = 1/N^2。由此,我们得出在获得所需结果之前您必须等待k次丢弃的概率为P( Y = k) = p * (1-p)^(k-1)。这意味着,对于N = 10,您需要67个随机数才能获得超过50%的概率,而457则需要概率超过99%。

为您提供大概k以获得价值所需的投掷次数alpha的通用公式为:

k > (log(1 - alpha) / log(1-p)) -1

其中p定义如上,等于1/N^2

随着N越来越大,这可能会变得更糟。你可以考虑创建一个你需要的索引列表,并随机获取它。