水库采样算法


//水库采样 用较小的开销来估计一个较大的数据流
1
#include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 int main() 5 { 6 int count=0; 7 long long int sum_all=0; 8 long int sum=0; 9 int i=0; 10 int data;//取数据 11 int length=500;//水库大小 12 int *set=(int *)malloc(length*sizeof(int));//定义一个集合 13 int index=0;//下标 14 int randIndex=0;//随机下标 15 double randNum=0;//随机数 16 FILE *fp=fopen("stream_sample.txt","r"); 17 srand(time(0));//以time(0)为种子 18 if(!fp) 19 { 20 printf("file open failed !\n"); 21 system("pasue"); 22 return -1; 23 } 24 while(!feof(fp)) 25 { 26 fscanf(fp,"%d",&data);//取文本中的数据 27 sum_all+=data;//所有数据之和 28 //打印所有数据 29 //printf("%d\t",data); 30 if(index<length)//水库填充时 31 { 32 set[index]=data; 33 index++; 34 } 35 else//水库被填充满时 36 { 37 randNum=(rand()%(index+1)); 38 if(randNum<length) 39 { 40 randIndex=rand()%length; 41 set[randIndex]=data; 42 } 43 index++; 44 } 45 46 } 47 printf("\n-----------------------------------------\n"); 48 printf("一共有%d个数据\n",index); 49 printf("\n-----------------------------------------\n"); 50 printf("水库中的数"); 51 for(i=0;i<length;i++) 52 { 53 printf("%d\t",set[i]); 54 } 55 printf("\n"); 56 57 printf("\n-----------------------------------------\n"); 58 59 printf("\n-----------------------------------------\n"); 60 for(i=0;i<length;i++) 61 { 62 sum+=set[i];//水库中的叠加 63 } 64 printf("%lf\t%lf",(double)sum/length,(double)sum_all/(index-1)); 65 printf("\n"); 66 67 fclose(fp); 68 system("pause"); 69 return 0; 70 }

只是简单理解,代码还有许多不足之处

转载于:https://www.cnblogs.com/SimonKly/p/6838805.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值