1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 #define N 1000//采样点的个数 6 #define M 5//分组 7 8 #define SIZE 10000 9 10 typedef struct 11 { 12 int element; 13 int count; 14 }ATTRIBUTE; 15 16 17 int main() 18 { 19 ATTRIBUTE attr[100000]; 20 int secmom=0;//真实二阶矩 21 int data;//接收读取之后的值 22 int i=0,j,k;//循环控制变量 23 int count_tmp=0;//临时计数变量 24 //int n=5;//采样点的个数 25 double secmom_estima=0; 26 ATTRIBUTE sample[10000]; 27 int tmp; 28 int a[10000]; 29 int loc[N];//采样位置保存在数组里 30 int sample_group[M][N]; 31 //FILE *fp =fopen("./stream_for_ams.txt","r"); 32 33 FILE *fp =fopen("./stream_sample_ams.txt","r"); 34 35 srand(time(0)); 36 for(j=0;j<N;j++) 37 { 38 loc[j]=rand()%SIZE;//获取随机采样位置 39 } 40 41 for(j=0;j<N;j++)//随机位置排序 42 { 43 for(k=j+1;k<N;k++) 44 { 45 if(loc[j] > loc[k]) 46 { 47 tmp = loc[k]; 48 loc[k]=loc[j]; 49 loc[j]=tmp; 50 } 51 } 52 } 53 54 if(fp == NULL)//文件读取失败 55 { 56 printf("file can't open!\n"); 57 exit(0); 58 } 59 while(!feof(fp)) 60 { 61 fscanf(fp,"%d",&data); 62 a[i]=data;//存数据 63 /***************采样*****************/ 64 for(j=0;j<N;j++) 65 { 66 if(loc[j] == i) 67 { 68 sample[j].element=data; 69 sample[j].count=0; 70 } 71 if(sample[j].element == data) 72 { 73 sample[j].count+=1; 74 } 75 } 76 77 /*****************真实***********************/ 78 for(j=0;j<count_tmp;j++) 79 { 80 if(attr[j].element == data)//如果该数据被存过则count+1 81 { 82 attr[j].count +=1; 83 break;//扫描比对成功退出循环 84 } 85 } 86 if( j == count_tmp)//如果没有该数据第一次出现 87 { 88 attr[count_tmp].element=data;//记录 89 attr[count_tmp].count=1; 90 count_tmp++;//记录第一次出现的数 91 } 92 printf("%.2lf%%\r", i * 100.0/ SIZE); 93 i++; 94 } 95 96 /******************组合估计二阶矩***********************/ 97 for(i=0;i<M;i++)//分组M 98 { 99 for(j=0;j<N;j++)//每组N个随机位置 100 { 101 loc[j]=rand()%SIZE;//获取随机采样位置 102 } 103 for(j=0;j<N;j++)//随机位置排序 104 { 105 for(k=j+1;k<N;k++) 106 { 107 if(loc[j] > loc[k]) 108 { 109 tmp = loc[k]; 110 loc[k]=loc[j]; 111 loc[j]=tmp; 112 } 113 } 114 } 115 for(j=0;j<N;j++) 116 { 117 if(loc[j] == i) 118 { 119 sample_group[i][j]= 120 sample[j].count=0; 121 } 122 if(sample[j].element == data) 123 { 124 sample[j].count+=1; 125 } 126 } 127 128 } 129 130 /************估计无组合估计二阶矩**********************/ 131 for(j=0;j<N;j++) 132 { 133 secmom_estima+=SIZE*(2.0*sample[j].count-1); 134 } 135 printf("无组合估计二阶矩:%.2lf\n",secmom_estima/N); 136 137 /***********真实二阶矩*************/ 138 for(j=0;j<count_tmp;j++) 139 { 140 //printf("%d\t%d\n",attr[j].element,attr[j].count); 141 secmom+=attr[j].count*attr[j].count; 142 } 143 printf("独立数%d\n",count_tmp); 144 printf("真实二阶矩为:%d\n",secmom); 145 146 system("pause"); 147 return 0; 148 }