[从头学数学] 第254节 Python实现数据结构:bloom Filter

剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。


正剧开始:
星历2016年08月01日 10:17:09, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。




这次主要是关于bloom Filter这种成员审查结构




这个结构已经有人用Python实现了,这里基本是照抄一下,用到了上节的BitSet。


<span style="font-size:18px;">class BloomFilter(): 
    class __SimpleHash():
        def __init__(self, cap, seed):  
            self.cap = cap  
            self.seed = seed  
          
        def hash(self, value):  
            ret = 0  
            for i in range(len(value)):  
                ret += self.seed*ret + ord(value[i])  
            return (self.cap-1) & ret 
    
      
    def __init__(self, BIT_SIZE=24):  
        self.BIT_SIZE = 1<<BIT_SIZE  #默认16M
        self.seeds = [5, 7, 11, 13, 31, 37, 61]  
        self.bitset = BitSet(self.BIT_SIZE)  
        self.hashFunc = []  
          
        for i in range(len(self.seeds)):  
            self.hashFunc.append(BloomFilter.__SimpleHash(self.BIT_SIZE, self.seeds[i]))  
          
    def insert(self, value):  
        for f in self.hashFunc:  
            loc = f.hash(value)  
            self.bitset[loc] = 1  
            
    def isContains(self, value):  
        if value == None:  
            return False  
        ret = True  
        for f in self.hashFunc:  
            loc = f.hash(value)  
            ret = ret & self.bitset[loc]  
        return ret    

    #计算适合的bit位数
    def calcPropM(self, n, falseProbability = 1e-4):
        #n是样本数量
        m = -n*math.log(falseProbability)/(math.log(2)**2);

        return m;

    #计算适合的hash函数数量
    def calcPropK(self, n):
        m = self.calcPropM(n);
        k = m/n*math.log(2);
        return k;
  
</span>




用例:

<span style="font-size:18px;">def main():
    #计时开始
    startTime = time.clock();

    fd = open("urls.txt")
    fout = open("output.txt", 'w');
    
    bloomfilter = BloomFilter(16)
    s = '';
    
    #文件最后一定要加exit行
    while True:  
        #url = raw_input()  
        url = fd.readline()
       
        if str(url[0:4]) == 'exit': #if url is equal exit break  
            break
        elif(len(url) > 8):
            if bloomfilter.isContains(url) == False:
                s = 'inset:'+url+'\n';
                fout.write(s);
                s = '';
                bloomfilter.insert(url)  
            else:  
                print('*** url :%s has exist' % url);

    print("--end--");
    fd.close();
    fout.close();
    
    
    #计时结束
    endTime = time.clock();

    #打印结果
    print('操作用时:{0:.3e} s'.format(endTime-startTime));</span>

#URL测试文件,去此页面最下方有
http://blog.csdn.net/mwsister/article/details/51555698
#C语言实现的BloomFilter,参见此页
http://blog.csdn.net/hguisu/article/details/7866173
#本页的代码,来自此页
http://blog.csdn.net/demon24/article/details/8537665


本节到此结束,欲知后事如何,请看下回分解。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值