算法导论5.3-7集合的随机样本

来源:互联网 发布:七爷交友平台知乎 编辑:程序博客网 时间:2024/06/08 08:13

问题:
假设我们希望创建集合{1,2,3,…,n}的一个随机样本,即一个具有m个元素的集合S,其中0<=m<=n,使得每个m集合能够等可能的创建。
解决方法:

第一种:

对i=1,2,…,n设A[i]=i,调用RANDOMIZE-IN-PLACE(A),然后取最前面的m个数组元素,RANDOMIZE-IN-PLACE在前一篇博客随机排列数组中有具体说明。该种方法会对RANDOM调用n次。

第二种:

如下伪代码描述的递归过程RANDOM-SAMPLE,该过程返回集合的随机m子集S,其中每个m子集是等可能的,然而只对RANDOM调用m次。

RANDOM-SAMPLE(m,n)if m == 0    return empty set Selse    S = RANDOM-SAMPLE(m - 1, n - 1)    i = RANDOM(1, n)    if i was in set S        add n to set S    else add i to set S    return S

下面论证该算法的正确性,可以模仿随机排列数组中证明过程RANDOMIZE-IN-PLACE所使用到的归纳法。
假设m-1次递归返回的(m-1)集合共Cm1n1种,且每种集合的可能性相同。则在第m次递归中,得到S中包含n的m集合的概率为:
1Cm1n1×mn=1Cmn
得到S中不包含n的m集合的概率为:
1Cmn1×nmn=1Cmn
又由第一次递归返回的为空集,1种且概率为1,易知,该算法可得正确结果,即可生成Cmn种结果,且每种结果的可能性相同。

原创粉丝点击