您的位置:首页 > 其它

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

2016-04-25 13:42 218 查看
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),与抽样样本大小有关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 数据