雜湊與海量資料處理

2021-10-12 02:00:11 字數 2069 閱讀 1253

問題二:與上題目條件相同,如何找出top k的ip?問題三:直接用linux命令如何實現?

對於問題一:

對於問題二:

要想統計次數最多的前k個ip,這裡需要建k個元素的小堆,每次選出的ip與堆頂元素比較如果大於堆頂元素就替換掉堆頂元素並且向下調堆,這樣到最後堆中的資料就是出現次數最多的前k個ip

對於問題三:cat logfile | sort -r | uniq | awk nr==排行數

先使用sort -r進行次數由多到少的排序,再使用uniq去重,最後使用awk獲取結果

問題四:給定100億個整數,設計演算法找到只出現一次的整數?問題五:給兩個檔案,分別有100億個整數,只有1g記憶體,如何找到兩個檔案的交集?

對於問題四:

分析一下100億個數字需要的記憶體:4×100 ×10^8 / 1024/1024/1024 = 37.252g

很顯然與題目一類似,可以將這100億個數字分100份分別儲存在檔案中,通過int index = numhash(int num) %100雜湊切分,在每份檔案中找出只出現一次的數字,最後將這100分檔案結果歸納在一起即可找出!

但是可以使用點陣圖來解決這種存在與否、出現一次的問題,如果是判斷存不存在之類的問題可以使用乙個位就可以表示,如:0表示不存在,1表示存在,在本題目中統計只出現一次則需要使用乙個位來表示,0表示不存在或者出現多次,1表示只出現一次!

對於問題五:

也是只有1g記憶體,在這裡兩個檔案則需要使用兩個位圖,然後根據兩個點陣圖的交集,也就是將兩個位圖&操作來求出兩個檔案的交集!

問題六:1個檔案有100億個int,1g記憶體,設計演算法找到出現次數不超過2次的所有整數

對於問題六:

這個問題實際上是問題四的變形,分析可知不超過兩次的情況直接使用兩個位元位來完成,00表示0次,01表示一次,10表示兩次,11表示超過兩次,這樣處理問題無論怎麼變化都是有效的!

問題七:給兩個檔案,分別有100億個query(查詢),我們只有1g記憶體,如何找到兩個檔案交集?分別給出精確演算法和近似演算法?問題八:如何擴充套件bloomfilter使得它支援刪除元素的操作?問題九:如何擴充套件bloomfilter使得它支援計數操作?

對於問題七:

對於問題八和問題九:

布隆的刪除和計數可歸為一類問題,原本布隆是乙個元素對映到多個位置上,這個位置上的值是乙個key,現在將其改為資料存在的個數,每當對映到相同的位置,該位置上的數進行加1,最後每個位置上的值表示出現某一元素對映到該位的次數!標準的bloomfilter只支援插入和查詢兩種操作,如果表達的集合是靜態集合的時候,在初始化集合大小,確定hash k的個數,控制錯誤率的基礎上,bloomfilter可以很好的滿足需求。但是對於一些動態集合,bloomfilter不滿足需求了,其不支援刪除操作,現引入counting bloomfilter,能解決相關問題,具體見:

問題十:給上千個檔案,每個檔案大小為1k—100m。給n個詞,設計演算法對每個詞找到所有包含它的檔案,你只有100k記憶體

賞 謝謝你請我喝咖啡

支付寶

海量資料處理

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...