Algorithm &引用;“编程珍珠”:从序列中采样m个元素
从编程珍珠:: 输入由两个整数m和n组成,其中mAlgorithm &引用;“编程珍珠”:从序列中采样m个元素,algorithm,sampling,Algorithm,Sampling,从编程珍珠:: 输入由两个整数m和n组成,其中m
initialize set S to empty
size = 0
while size < m do
t = bigrand() % n
if t is not in S
insert t into S
size++
print the elements of S in sorted order
将集合S初始化为空
大小=0
当尺寸
在上面的伪代码中,bigrand()
是一个函数,返回一个大的随机整数(比m和n大得多)
有人能帮我证明上述算法的正确性吗
根据我的理解,每个输出都应该有1/C(n,m)的概率。
如何证明上述算法能够保证概率为1/C(n,m)的输出?该算法得到的每个解都是有效的 有多少种解决方案? 直到最后一行(排序)有
n*(n-1)*(n-2)*..*(n-m)
不同的排列或n/(n-m)代码>并且每个结果具有相同的概率
排序时,可能的解决方案数量减少了m
所以可能输出的数量是n/((n-m)!*m!)
这就是你想要的
n/((n-m)!m!)=C(n,m)