亚线性空间算法-水库抽样算法
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),与抽样样本大小有关
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),与抽样样本大小有关
相关文章推荐
- 我是运营,我没有假期
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- Ruby实现的矩阵连乘算法
- 修复mysql数据库
- C#插入法排序算法实例分析
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#实现窗体间传递数据实例
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#中的委托数据类型简介