对于海量字符串的查找,一般有两种方法,一种是建树,还有一种就是bf算法,即布隆过滤器,这个从原来上讲比较简单,也易于实现,主要就是根据哈希算法来实现。

int len(char *ch)
{
int m=0;
while(ch[m]!='\0') {
m++;
}
return m;
} bool judge(char *vertor,char ch[]){
if (GETBIT(vertor,RSHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,JSHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,PJWHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,ELFHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,BKDRHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,SDBMHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,DJBHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,DEKHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,BPHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,FNVHash(ch,len(ch)))==0) return false;
if (GETBIT(vertor,APHash(ch,len(ch)))==0) return false;
else
return true; } int main(int argc,char *argv[]){
argv[1]="/Users/emaillist.dat";
argv[2]="/Users/checklist.dat";
argv[3]="/Users/result2222.dat"; clock_t a=clock();
int pos=1,k=0,j=0;
FILE *fp_strpool,*fp_checkedstr,*fp_result;
fp_strpool=fopen(argv[1], "r");//打开三个文件
fp_checkedstr=fopen(argv[2], "r");
fp_result=fopen(argv[3], "w");
char ch[ARRAY_SIZE];
char *vertor;
char yes[5]="yes\n";
char no[4]="no\n";
vertor=(char *)calloc(SIZE , sizeof(char) );//申请位数组
for (int i=0; i<SIZE; i++) {
vertor[i]=0;
}
while (fscanf(fp_strpool, "%s",ch)==1) {
//fgets(ch, ARRAY_SIZE, fp_strpool);
SETBIT(vertor, RSHash(ch,len(ch)));
SETBIT(vertor, JSHash(ch,len(ch)));
SETBIT(vertor, PJWHash(ch,len(ch)));
SETBIT(vertor, ELFHash(ch,len(ch)));
SETBIT(vertor, BKDRHash(ch,len(ch)));
SETBIT(vertor, SDBMHash(ch,len(ch)));
SETBIT(vertor, DJBHash(ch,len(ch)));
SETBIT(vertor, DEKHash(ch,len(ch)));
SETBIT(vertor, BPHash(ch,len(ch)));
SETBIT(vertor, FNVHash(ch,len(ch)));
SETBIT(vertor, APHash(ch,len(ch)));
j++; }
while (fscanf(fp_checkedstr, "%s",ch)==1) {
k++;
//fgets(ch, ARRAY_SIZE, fp_checkedstr);
if (judge(vertor,ch)) {
printf("%d\n",pos);
pos++;
fputs(yes, fp_result);
}
else
fputs(no, fp_result);
}
printf("%d %d\n",j,k);
fclose(fp_result);
fclose(fp_checkedstr);
fclose(fp_strpool);//关闭文件
clock_t b=clock();
double duration = (double)(b - a) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
}
 
 
 
 

海量字符串查找——bloom filter,c的更多相关文章

  1. 海量数据处理算法—Bloom Filter

    海量数据处理算法—Bloom Filter 1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bl ...

  2. 【转】海量数据处理算法-Bloom Filter

    1. Bloom-Filter算法简介 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.它是一个判断元素是否存在于 ...

  3. 海量数据处理之Bloom Filter详解

    前言 :  即可能误判    不会漏判   一.什么是Bloom Filter     Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函 ...

  4. php实现Bloom Filter

    Bloom Filter(BF) 是由Bloom在1970年提出的一种多哈希函数映射的高速查找算法,用于高速查找某个元素是否属于集合, 但不要求百分百的准确率. Bloom filter通经常使用于爬 ...

  5. Bloom Filter解析

    布隆过滤器简介:https://www.cnblogs.com/Jack47/p/bloom_filter_intro.html 布隆过滤器详解:原文链接:http://www.cnblogs.com ...

  6. Bloom Filter的算法

     Bloom Filter的算法: 为了降低冲突的概念,Bloom Filter使用了多个哈希函数,而不是一个.创建一个m位BitSet,先将所有位初始化为0,然后选择k个不同的哈希函数.第i个哈希函 ...

  7. Bloom Filter算法

    Bloom Filter算法详解 什么是布隆过滤器 布隆过滤器(Bloom Filter)是 1970 年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数 (下面详细说),实际上你也可 ...

  8. 海量信息库,查找是否存在(bloom filter布隆过滤器)

    Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识 ...

  9. 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想

    转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html   布隆过滤器[1](Bloom Filter)是由布隆(Burton ...

随机推荐

  1. java中的日志组件-log4j

    1.为什么使用日志组件 Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT的事件记录器:还可以控制每一 ...

  2. Js中 关于top、clientTop、scrollTop、offsetTop的用法

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  3. Rhel6-heartbeat+lvs配置文档

    系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.119 server19.example.com 192.168.12 ...

  4. Spring依赖关系

    在Spring中,各个模块的依赖关系通过简单的IoC配置文件进行描述,使这些外部化的信息集中并且明了,我们在使用其他组件服务时,只需要去配置文件中了解和配置这些依赖关系即可,也就是说这里关心的是接口, ...

  5. Quartz之CronExpression

    一 Cron Expression 的格式 Quartz的cronExpression见官网文档说明: http://www.docjar.com/docs/api/org/quartz/CronEx ...

  6. Android 自带图标库 android.R.drawable

    在xml文件中调用. android:title="@string/secure_connect"android:orderInCategory="100"an ...

  7. 转:115个Java面试题和答案——终极列表(上)

    转自:http://www.importnew.com/10980.html 本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的 ...

  8. C#获取项目程序及运行路径的方法

    1.asp.net webform用“Request.PhysicalApplicationPath获取站点所在虚拟目录的物理路径,最后包含“\”: 2.c# winform用 A:“Applicat ...

  9. myEclipse下安装SVN插件

    step1.首先下载svn插件, step2.将下载下来的插件解压缩任意目录,找到里面的features 和plugins两个文件夹, step3.在myEclipse的安装目录下找到dropins文 ...

  10. (spring-第11回【IoC基础篇】)BeanWrapper--实例化Bean的第四大利器

    重复是理解和记忆的最好方法.在讲实例化Bean的每个步骤之前,我都会先复习一下Bean实例化的整个过程: 结合图片我们回顾一下具体的过程: ResourceLoader加载配置信息, 由BeanDef ...