a,b兩個檔案各存放50億條url,每條url占用64位元組,記憶體限制4g,找出a,b檔案共同的url
答:1g檔案的大致位元組數:2^30 約等於 1的9次方(2的10次方約等於100) 所以50億條url大概為5*64=320g,所以將大檔案分為1000個小檔案,怎麼分,每個url進行hashcode再對1000取餘。這個a檔案就被分為(a0,…a999)了,同樣的對b進行這樣操作,b檔案就被分為(b0,…b999)了。因為是取餘,所以相同的url肯定會出現在相同下標的檔案中。 判斷的邏輯是先將a檔案全部放到hashset中,然後把b中記憶體依次做判斷。1g大小的檔案,裡面每行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m,返回頻數最高的100個詞
a、順序讀檔案,對於每個詞x,取hash(x)%5000,然後按照該值存到5000個小檔案中,這樣每個檔案大概200k左右。如果其中有的檔案超過了1m大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1m。對每個小檔案,統計每個檔案**現的詞及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個節點的最小堆),並把100個詞對應的頻率存入檔案,這樣又取到了5000個檔案。下一步就是把這5000個檔案進行歸併給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中?b、這個資料具有很明顯的特點,詞的大小為 16 個位元組,但是記憶體只有 1m做hash有些不夠,所以可以用來排序。記憶體可以當輸入緩衝區使用。
方案一申請512m的記憶體,乙個bit位代表乙個unsigned int值。讀入40億個數,設定相應的bit位,讀入要查詢的數,檢視相應bit位是否為1,為1表示存在,為0表示不存在。bitmap(位圖)方案二
因為2^32為40億多,所以給定乙個數可能在,也可能不在其中;這裡我們把40億個數中的每乙個用32位的二進位制來表示,假設這40億個數開始放在乙個檔案中。然後將這40億個數分成兩類:
1.最高位為0
2.最高位為1
並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=20億,而另乙個》=20億(這相當於折半了);與要查詢的數的最高位比較並接著進入相應的檔案再查詢再然後把這個檔案為又分成兩類:
1.次最高位為0
2.次最高位為1
並將這兩類分別寫入到兩個檔案中,其中乙個檔案中數的個數<=10億,而另乙個》=10億(這相當於折半了); 與要查詢的數的次最高位比較並接著進入相應的檔案再查詢。以此類推,就可以找到了,而且時間複雜度為o(logn)。
原理就是開闢乙個bit陣列,陣列的下標就是對應插入的值,比如你向這個bit陣列插入6這個數字,那麼它就是在陣列下標為6的位置,將這個位置的值設為1,標識有6這個值。判斷乙個數字存不存在挺好用的。
bitmap:
布隆過濾器
原理就是開闢乙個bit陣列,對目標資料先進行hash,取得值後,找到這個值對應陣列下標(比如10),將這個下標對應的值設為1。當查詢乙個值存不存在時,同樣對查詢的值進行hash,拿到對應陣列下標,如果對應陣列下標值為0 ,則一定不存在。如果為1,則大概率存在。為了提高準確性,進行hash時,會呼叫不同hash函式,拿到不同的hash值。
字典樹 (trie樹)
參考:
海量資料處理
1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...
海量資料處理
給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...
海量資料處理
分而治之 hash對映 hash統計 堆 快速 歸併排序 300萬個查詢字串中統計最熱門的10個查詢。針對此類典型的top k問題,採取的對策往往是 hashmap 堆。hash統計 先對這批海量資料預處理。具體方法是 維護乙個key為query字串,value為該query出現次數的hashtab...