给定100亿个网址,如何检测出重复的文件。

给定100亿个网址,如何检测出重复的文件?这里所谓的“重复”是指两个URL彻底相同。函数

或者:测试

使用hash将全部整数映射到1000个文件中,在每一个文件中使用 bitmap,用两个bit表示出现次数,00表示没出现过,01表示出现过1次,10表示出现过屡次,11舍弃,最后归并每一个文件中出现只有1次的数即为所求。排序

若是是有符号整数的话,范围为-2147483648~2147483647 无符号整数为0~4294967296 有符号的使用两个bitset,一个存放正数,一个负数。 每一个数使用两个位来判断其出现几回。00表示出现0词,01出现1次,10出现大于一次。 好比说存放整数100,就将bitset的第100*2位设置为+1,当全部数放完以后,对每两位进行测试看其值为多少?如果第i为与i+1为的值为 01,则这个整数:i*2,在集合中只出现了1次。须要总共用bitnun=(2^31*2)个位表示,需空间为int[bitnum],即512M.图片

将文件经过哈希函数成多个小的文件,因为哈希函数全部重复的URL只可能在同一个文件中,在每一个文件中利用一个哈希表作次数统计。就能找到重复的URL。这时候要注意的就是给了多少内存,咱们要根据文件大小结合内存大小决定要分割多少文件内存

topK问题和重复URL实际上是同样的重复的多了才会变成topK,其实就是在上述方法后得到全部的重复URL排个序,可是有点不必,由于咱们要 找topK时,最极端的状况也就是topK在用一个文件中,因此咱们只须要每一个文件的topK个URL,以后再进行排序,这样就比找出所有的URL在排序 方法优秀。还有一个topK个URL到最后仍是须要排序,因此咱们在找每一个文件的topK时,是否只须要找到topK个,其中顺序不用管,那么咱们就能够 用大小为K的小根堆遍历哈希表。这样又能够下降查找的时间。hash

这里我来说一下为何用小根堆。
小根堆是一棵彻底二叉树存在以下特性
(1)若树根结点存在左孩子,则根结点的值(或某个域的值)小于等于左孩子结点的值(或某个域的值);
(2)若树根结点存在右孩子,则根结点的值(或某个域的值)小于等于右孩子结点的值(或某个域的值);
(3)以左、右孩子为根的子树又各是一个堆。
建最小堆的过程,从最后一个叶节点的父节点开始,往前逐个检查各个节点,看其是否是符合父节点小于它的子节点,若是不小于,则将它的 子节点中最小的那个节点与父节点对换;不然,不交换,
这里写图片描述
 it

相关文章
相关标签/搜索