我有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)在矩阵中设置,则重复随机生成,直到找到未设置的元素。这种方式不使用任何额外的内存,但我很难估计性能......可能是一个案例,当除了一个元素之外的所有元素都被设置,并且随机重复很多次寻找空闲单元格?我是对的,一旦理论上随机一致地工作,这种情况不应该经常发生吗?
答案 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越来越大,这可能会变得更糟。你可以考虑创建一个你需要的索引列表,并随机获取它。