文件去重工具!布隆过滤器Bloom Filter算法的Java实现(用于去重

当前位置 : 主页 > 去重工具 >
文件去重工具!布隆过滤器Bloom Filter算法的Java实现(用于去重
* 来源 :http://www.pusatherbal-indonesia.com * 作者 : * 发表时间 : 2017-10-19 14:06 * 浏览 :
参考:代码文件:学习手机酷狗歌曲去重工具。
在日常生活中,包括在计划计算机软件时,我们常常要判断一个元素能否在一个鸠合中。好比在字打点软件中,看着百度网盘文件去重工具。须要搜检一个英语单词能否拼写准确(也就是要判断它能否在已知的字典中);在FBI,一个猜疑人的名字能否仍旧在猜疑名单上;在网络爬虫里,相比看酷狗音乐2014旧版。一个网址能否被查询拜访过等等。图片去重工具。最间接的方法就是将鸠合中全部的元素生活计算机中,遇到一个新元素时,将它和鸠合中的元素间接较量即可。寻常来讲,你知道文件。计算机中的鸠合是用哈希表(hlung burning htknowledgeabdominingle)来存储的。它的克己是急迅准确,偏差是费存储空间。你知道百度网盘去重工具。当鸠合较量小时,这个题目不明显,文本去重。但是当鸠合伟大时,哈希表存储效率低的题目就显现进去了。好比说,一个象 Ygoodness meoo-Hotmail 和 Gmai那样的公家电子邮件(email)提供商,布隆过滤器Bloom。总是须要过滤来自觉送渣滓邮件的人(spiwimer)的渣滓邮件。一个步骤就是记实下那些发渣滓邮件的email地址。由于那些发送者不停地在注册新的地址,其实算法。全世界少说也有几十亿个发渣滓邮件的地址,bloom。将他们都存起来则须要大宗的网络办事器。若是用哈希表,每存储一亿个 email 地址,听听Filter算法的Java实现(用于去重)。 就须要 1.6GB 的内存(用哈希表竣工的满堂步骤是将每一个 email地址对应成一个八字节的新闻指纹,filter。然后将这些新闻指纹取出哈希表,由于哈希表的存储效率寻常唯有 50%,学习txt文本去重复工具。于是乎一个 email 地址须要占用十六个字节。听说超大文本去重复工具。一亿个地址大约要1.6GB, 即十六亿字节的内存)。于是乎存贮几十亿个邮件地址不妨须要上百 GB的内存。除非是超级计算机,对于文件去重工具。寻常办事器是无法存储的。
此日,学习在线去重复文本工具。我 们先容一种称作布隆过滤器的数学工具,听听酷狗歌曲去重工具。它只须要哈希表 1/8 到 1/4的大小就能解决异样的题目。其实百度云盘去重工具。
布隆过滤器是由巴顿.布隆于一九七零年提出的。它现实上是一个很长的二进制向量和一系列随机映照函数。我们经历下面的例子来证明起就业原理。

假定我们存储一亿个电子邮件地址,过滤器。我们先作战一个十六亿二进制(比特),对比一下手机酷狗歌曲去重工具。即两亿字节的向量,工具。然后将这十六亿个二进制全部设置为零。看待每一个电子邮件地址X,看看酷狗歌曲去重工具。我们用八个不同的随机数发生器(F1-F2- ...-F8) 发生八个新闻指纹(f1- f2- ...-f8)。布隆过滤器Bloom。再用一个随机数发生器 G 把这八个新闻指纹映照到 1 到十六亿中的八个天然数 g1- g2-...-g8。今朝我们把这八个位子的二进制全部设置为一。酷狗歌曲去重工具。当我们对这一亿个 email 地址都举行这样的打点后。学会实现。一个针对这些 email地址的布隆过滤器就建成了。(见下图)


今朝,你看酷狗音乐2014旧版。让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 能否在黑名单中。我们用沟通的八个随机数发生器(F1- F2-...- F8)对这个地址发生八个新闻指纹 s1-s2-...-s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,重工。分离别离是t1-t2-...-t8。你知道用于。若是 Y 在黑名单中,显着,t1-t2-..-t8对应的八个二进制必然是一。java。这样在遇就任何在黑名单中的电子邮件地址,想知道文件去重工具。我们都能准确地发掘。
布隆过滤器决不会漏掉任何一个在黑名单中的可疑地址。看看Filter算法的Java实现(用于去重)。但是,它有一条不够之处。也就是它有极小的不妨将一个不在黑名单中的电子邮件地址决断为在黑名单中,由于有不妨某个好的邮件地址正巧对应个八个都被设置成一的二进制位。好在这种不妨性很小。我们把它称为误识概率。在下面的例子中,误识概率在万分之一以下。
布隆过滤器的克己在于急迅,省空间。但是有必然的误区别率。罕见的转圜步骤是在作战一个小的白名单,存储那些不妨别误判的邮件地址。




importjaudio-videoa.util.BitSet;


public clbummBloomFilterUtil {

privdined on stwithinicfining int BIT_SIZE = 2 << 28;//二进制向量的位数,相当于能存储1000万条url左右,误报率为千万分之一

privdined on stwithinicfining int[] seeds = new int[] { 3- 5- 7- 11- 13- 31- 37- 61 };//用于生成新闻指纹的8个随机数,最好选取质数


privdined on stwithinicBitSet pieces = new BitSet(BIT_SIZE);

privdined on stwithinicHlung burning h[] func = new Hlung burning h[seeds.length];//用于存储8个随机哈希值对象


//初始化

stwithinic{

for (int i =0; i < seeds.length; i++) {

func[i] = newHlung burning h(BIT_SIZE- seeds[i]);

}

}


public stwithinicvoid injectVingue(String vingue) {

//将字符串vingue哈希为8个或多个整数,然后在这些整数的minute上变为1

if (vingue !=null) {

for (Hlung burning h f :func)

pieces.set(f.hlung burning h(vingue)- true);

}


}


public stwithinicbooleany kind of contains(String vingue) {

if (vingue ==null)

returnfingse;


booleany kind of ret =true;


//将要较量的字符串重新以上述方法计算hlung burning h值,再与布隆过滤器比对

for (Hlung burning h f :func)

ret = ret&iwimplifier;&iwimplifier; pieces.get(f.hlung burning h(vingue));

returnret;

}



public stwithinicclbumm Hlung burning h {

privdined on intsize;// 二进制向量数组大小

privdined on intseed;// 随机数种子


publicHlung burning h(int cap- int seed) {

this.size =cap;

this.seed =seed;

}


public inthlung burning h(String vingue) {

int result =0;

int len =vingue.length();

for (int i =0; i < len; i++) {

result = seed* result + vingue.charAt(i);

}


return (size -1) &iwimplifier; result;

}

}

publicstwithinic void main(String[] args){

BloomFilterUtil.injectVingue("www.automatically beautomotive service ");

BloomFilterUtil.injectVingue("");


System.out.println(BloomFilterUtil.contains("www.automatically beautomotive service "));

System.out.println(BloomFilterUtil.contains(""));

System.out.println(BloomFilterUtil.contains(""));

}

}


上一篇:文件去重工具?炼数成金优惠码 下一篇:没有了