#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <map>
using namespace std;
map<int,int>::iterator iter;
map<int,int> Data;
void Read(int n,int bits,int* bit,int* a,int* b){//构建过滤器
int temp;
for(iter = Data.begin(); iter != Data.end(); iter++){
for(int i = 0; i < n; i++){
temp = a[i] * iter->first + b[i];
bit[temp % bits] = 1;
}
}
}
void Judge(int n,int bits,int* bit,int* a,int* b,int all){//判断数据是否存在
int nonexist = 0;
int temp;
for(iter = Data.begin(); iter != Data.end(); iter++){
for(int i = 0; i < n; i++){
temp = a[i] * iter->first+ b[i];
if(bit[temp % bits] != 1){
nonexist++;
break;
}
}
}
printf("预测值:%d\t 不存在:%d\n 真实值:10008\t 不存在:9992\n",all - nonexist,nonexist);
}
int main(){
FILE *fp;
int n;
int bits;
printf("使用比特位数:");
scanf("%d",&bits);
bits = bits*8;
printf("使用hash函数个数:");
scanf("%d",&n);
int bit[bits] = {0};
int a[n],b[n];//用于构造hash函数h(x)=ax+b mod bits
int all = 0;
double error;
srand((unsigned)time(NULL));
for(int i = 0; i < n; i++){
a[i] = rand() % 200 + 1;
b[i] = rand() % 1000 + 1;
//printf("%d\t%d\n",a[i],b[i]);
}
fp = fopen("stream_for_bm.txt","r");
if(fp == NULL){
printf("Can not open file stream_for_bm.txt!\n");
exit(0);
}
int temp;
while(fscanf(fp,"%d",&temp) != EOF){
Data[temp] = 0;
}
Read(n,bits,bit,a,b);
fclose(fp);
//输出比特数组
/*for(int i = 0; i < bits; i++){
printf("%d",bit[i]);
}
printf("\n");*/
Data.clear();
fp = fopen("stream_for_query.txt","r");
if(fp == NULL){
printf("Can not open file stream_for_bm.txt!\n");
exit(0);
}
while(fscanf(fp,"%d",&temp) != EOF){
all++;
Data[temp] = 0;
}
Judge(n,bits,bit,a,b,all);
//bits = bits/8;
error = 1 - pow(2.71828183,-n*10000/(1.0*bits));
error = pow(error,n);
printf("假阳率:%lf",error);
return 0;
}
布隆过滤器代码编写
最新推荐文章于 2024-04-06 20:19:37 发布