海量字符串查找——bloom filter,c

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

对于海量字符串的查找,一般有两种方法,一种是建树,还有一种就是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/wangzunwen/emaillist.dat";
    argv[2]="/Users/wangzunwen/checklist.dat";
    argv[3]="/Users/wangzunwen/result2222.dat";
//    argv[1]="/Users/wangzunwen/23333.dat";
//    argv[2]="/Users/wangzunwen/text.dat";
//    argv[3]="/Users/wangzunwen/result.txt";
    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 );
}
时间: 2024-10-10 15:25:24

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

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

1. Bloom-Filter算法简介 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.它是一个判断元素是否存在于集合的快速的概率算法.Bloom Filter有可能会出现错误判断,但不会漏掉判断.也就是Bloom Filter判断元素不再集合,那肯定不在.如果判断元素存在集合中,有一定的概率判断错误.因此,Bloom Filter不适合那些“零错误”的应用场合.而在能容忍低错误率的应用场合下,Bloom Fi

海量数据处理算法—Bloom Filter

1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.它是一个判断元素是否存在集合的快速的概率算法.Bloom Filter有可能会出现错误判断,但不会漏掉判断.也就是Bloom Filter判断元素不再集合,那肯定不在.如果判断元素存在集合中,有一定的概率判断错误.

海量数据处理之Bloom Filter详解

前言 :  即可能误判    不会漏判 一.什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1.检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在:如果都是1,则被检索元素很可能在.这就是布隆过滤器的基本思想. 但Bloom Filter的这种高效是有一定代价的:在判

php实现Bloom Filter

Bloom Filter(BF) 是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法,用于快速查找某个元素是否属于集合, 但不要求百分百的准确率. Bloom filter通常用于爬虫的url去重,即判断某个url是否已经被爬过. 原理方面我引用一篇别人的文章,讲的比较清晰了,在此我不予赘述, 更多信息可以参考其论文. 看过几个php实现的BF,都觉得可读性不是很强, 本文主要给出我对Bloom Filter的一个php实现. 原理: <引用自这篇文章> 一. 实例 为了说明Bl

Bloom Filter 大规模数据处理利器

BloomFilter–大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. 一. 实例 为了说明Bloom Filter存在的重要意义,举一个实例: 假设要你写一个网络爬虫程序(web crawler).由于网络间的链接错综复杂,爬虫在网络间爬行很可能会形成“环”.为了避免形成“环”,就需要知道爬虫程序已经访问过那些URL.给一个URL,怎样知道爬虫程序

Bloom Filter 实例

转自 http://www.dbafree.net/?p=36 BloomFilter–大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. 一. 实例 为了说明Bloom Filter存在的重要意义,举一个实例: 假设要你写一个网络爬虫程序(web crawler).由于网络间的链接错综复杂,爬虫在网络间爬行很可能会形成“环”.为了避免形成“环”,就需要

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

Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识别率(false positive),即布隆过滤器报告某一元素存在于某集合中,但是实际上该元素并不在集合中,但是没有错误识别的情形(false negative),即如果某个元素确实没有在该集合中,那么布隆过滤器是不会报告该元素存在于集合中的,没有漏报的情形出现,召回率为百分之百. 算法描述 布隆过

海量数据处理--bloom filter

例题:给定两个大文件,各含有50亿条url,要求利用4G内存快速找出共同的url 解答: 假设两个文件为A和B,4G内存有32G位,可以表示5G的url. 本文采用bloom filter解答: 首先简单介绍一下bloom filter的思想,其核心是:位数组:K个hash函数. 通过对大量数据处理,通过k个hash函数将大量数据压缩存储到多个位当中. 查找的时候,根据K个hash函数的结果,如果有0那么就不在集合中,如果没有0那么就在集合中(可能会误判). 这道题可以先通过对A处理,然后得到b

海量数据处理算法之Bloom Filter

算法介绍 Bloom Filter的中文名称叫做布隆过滤器,因为他最早的提出者叫做布隆(Bloom),因而而得此名.布隆过滤器简单的说就是为了检索一个元素是否存在于某个集合当中,以此实现数据的过滤.也许你会想,这还不简单,判断元素是否存在某集合中,遍历集合,一个个去比较不就能得出结果,当然这没有任何的问题,但是当你面对的是海量数据的时候,在空间和时间上的代价是非常恐怖的,显然需要更好的办法来解决这个问题,而Bloom Filter就是一个不错的算法.具体怎么实现,接着往下看. Bloom Fil