问题描述
- 从0~n-1中随机选取m(m < n)个不同整数,且使m个整数有序输出。
已知条件
- bigRand()产生一个远大于m和n的正整数;
- randInt(int i,int j)产生一个[i,j]的随机数;
- sort(int []a,int lo,int hi)对a中指定范围内数据排序
解决方法
- 【Knuth的S算法】从r个剩余元素中选择s个元素,以s/r的概率选择下一个。
/**
* 从0~n-1中随机选取m个随机数,且m个随机数输出结果有序。
* 时间复杂度:O(n);空间开销:O(1)
* 应用场景:n比较小
* @param m
* @param n
*
*/
public static void genKnuthS(int m,int n)
{
int select=m;
int remaining=n;
for(int i=0;i<n;i++)
{
if((bigRand()%remaining)<select)
{
System.out.println(i);
select--;
}
remaining--;
}
}
/**
* 随机整数插入有序集合
* 时间复杂度:O(mlogm);空间开销:集合存储开销。
* 应用场景:适合m相对n较小情况
* @param m
* @param n
*/
public static void genSets(int m,int n)
{
Set<Integer>S=