采样问题

本文探讨了如何从0~n-1中随机选择m个不同的整数,并保证有序输出。介绍了Knuth的S算法、Floyd算法以及两种变种算法P和P',并提到了解决重复随机数的方法。总结中指出,Knuth的S和Floyd算法是解决这类问题的有效策略。
摘要由CSDN通过智能技术生成

问题描述

  • 从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++)
        {
            //从r个剩余的整数中选择s个,以s/r的概率选择下一个
            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)
    {
        //使用Integer包装类,不如C++效率高
        Set<Integer>S=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值