首页 > 试题广场 >

假设我们希望创建集合{1,2,3,...,n}的一个随机样本

[问答题]
假设我们希望创建集合{1,2,3,...,n}的一个随机样本,即一个具有m个元素的集合S,其中,使得每个m集合能够等可能的创建。一种方法是对i=1,2,...,n设A[i]=i,调用RANDOM-IN-PLACE(A),然后取最前面的m个数组元素。这种方法会对RANDOM过程调用n次。如果n比m大很多,我们能够创建一个随机样本,只对RANDOM调用更少的次数。请说明下面的递归过程返回{1,2,3...,n}的一个随机m子集S,其中每个m子集是等可能的,然而只对RANDOM调用m次。
RANDOM-SAMPLE(m,n)
1 if m==0
2    return  3 else S=RANDOM-SAMPLE(m-1,n-1)
4        i = RANDOM(1,n)
5        if iS
6           S=S{n}
7        else S=S{i}
8        return S
RANDOMIZE-IN-PLACE(A)
1  n=A.length
2  for i=1 to n
3      swap A[i] with A[RANDOM(i,n)]

这道题你会答吗?花几分钟告诉大家答案吧!