給定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

相關文章
相關標籤/搜索