亚线性空间算法-水库抽样算法

来源:互联网 发布:相对不确定度的算法 编辑:程序博客网 时间:2024/04/29 04:59

1.算法描述

1)输入:一组数据,其大小未知
2)输出:这组数据的k个均匀抽样
3)要求:
      a、仅扫描数据一次
      b、空间复杂性为O(k)
      c、扫描到数据的前n个数字时(n>k),保存当前已扫描数据的k个均匀抽样


2.Java实现

package org.XX.com;
import java.util.*;

//水库调水抽样算法
public class Water {
//定义抽样数组大小
private static int array_size;
//定义抽样数据大小
private static int data_size;

    public static void main(String[] args){
    Random rd = new Random(); //生成随机数
    Scanner input = new Scanner(System.in);
    //抽样数据集
    ArrayList<Integer> al_set = new ArrayList<Integer>();
    //抽样数据数组
    ArrayList<Integer> al_num = new ArrayList<Integer>();
   
    System.out.println("请输入数组大小:");
    array_size = input.nextInt();
    System.out.println("请输入抽样数据数量:");
    data_size = input.nextInt();
   
    System.out.println("请输入全部数据:");
    //从输入的所有数据中选择data_size个样本数据,将抽样数据集保存到抽样数据集当中
    for(int i= 0 ;i< data_size; i++){
    al_set.add(input.nextInt());
    }
   
    //初始化抽样数据数组
    for(int i = 0 ; i < array_size; i++){
    al_num.add(0);
    }
   
    //从抽样数据当中选择array_size个抽样样本
    for(int i = 1 ;i <= data_size; i ++ ){
    int temp = al_set.get(i-1);//获取样本数据集数据
       int rand = rd.nextInt(i);//得到0-i的随机数据,而且必须要i>0
    if( rand< array_size){
    al_num.set(rand, temp);
    }
    }
   
    //输出抽样数据数组的数据
    for(int i = 0 ; i < array_size; i++){
    System.out.println(al_set.get(i));
    }
    }
}


3.算法分析

性质1:该采样是均匀,概率为array_size/data_size

性质2: 空间复杂性是O(k),与抽样样本大小有关

0 0
原创粉丝点击