剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年08月01日 10:17:09, 银河系厄尔斯星球中华帝国江南行省。
#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
阿伟看到了一本比较有趣的书,是关于《计算几何》的,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
本节到此结束,欲知后事如何,请看下回分解。