標籤:整數 ash 布隆過濾器 並且 div 標示 需要 元素 計數
1)給一個超過100G大小的log file,log中存著IP地址,設計演算法找到出現次數最多的IP地址?(與如何知道top K的IP,如何使用Linux系統命令實現)
Hash分桶法:
將100G檔案分成1000份,將每個IP地址映射到相應檔案中:file_id = hash(ip) % 1000
在每個檔案中分別求出最高頻的IP,再合并Hash分桶法;
使用Hash分桶法把資料分發到不同的檔案;
各個檔案分別統計top K;
2)給定100億個整數,設計演算法找到只出現一次的整數。
Hash分桶法,將100億個整數映射到不同的區間,在每個區間中分別找只出現一次的整數。
3)給兩個檔案,分別有100億個整數,我們只有1G記憶體,如何找到兩個檔案交集
掃描每個整數是否出現過,節省記憶體方法使用bitmap。桶分 + bitmap。如果整數是32bit,直接使用bitmap的方法實現。所有整數共2^32種可能,每個數用兩位表 示,00表示檔案均沒出現,10表示檔案1出現過,01表示檔案2出現過,11表示兩檔案均出現過,共需要2^32*2/8 = 1GB記憶體,遍曆兩個檔案中的所有整數,然後尋 找bitmap中11對應的整數即是兩個檔案的交集,這樣即可線性時間複雜度完成。
4)1個檔案有100億個int,1G記憶體,設計演算法找大出現次數超過2次的所有整數。
Bitmap擴充:用2個bit表示狀態,0表示未出現,1出現過1次,2出現過2次或以上。
5)給兩個檔案,分別有100億個query,我們只有1G記憶體,如何找到兩個檔案交集?分別給出精確演算法和近似演算法?
精確演算法:Hash分桶法
將兩個檔案中的query hash到N個小檔案中,並標明query的來源;
在各個小檔案中找到重合的query
將找到的重合query匯總
近似演算法:BloomFilter演算法
6)如何擴充BloomFilter使得它支援刪除元素的操作
將BloomFilter中的每一位擴充為一個計數器,記錄有多少個hash函數映射到這一位;刪除的時候,只有當引用計數變為0時,才真正將該位置為0。
7)如何擴充BloomFilter使得它支持度計數操作?
將BloomFilter中的每一位擴充為一個計數器,每個輸入元素都要把對應位置加1,從而支持度計數操作。計數個數為所有映射到的位置計數的最小值。
8)給上千個檔案,每個檔案大小為1K-100M。給n個詞,設計演算法對每個詞找到所有包含它的檔案,你只有100K記憶體。
0: 用一個檔案info 準備用來儲存n個詞和包含其的檔案資訊。
1 : 首先把n個詞分成x份。對每一份用產生一個布隆過濾器(因為對n個詞只產生一個布隆過濾器,記憶體可能不夠用)。把產生的所有布隆過濾器存入外存的一個檔案Filter中。
2:將記憶體分為兩塊緩衝區,一塊用於每次讀入一個布隆過濾器,一個用於讀檔案(讀檔案這個緩衝區使用相當於有界生產者消費者問題模型來實現同步),大檔案可以分為更小的檔案,但需要儲存大檔案的標示資訊(如這個小檔案是哪個大檔案的)。
3:對讀入的每一個單詞用記憶體中的布隆過濾器來判斷是否包含這個值,如果不包含,從Filter檔案中讀取下一個布隆過濾器到記憶體,直到包含或遍曆完所有布隆過濾器。如果包含,更新info 檔案。直到處理完所有資料。刪除Filter檔案。
備忘:
1:關於布隆過濾器:其實就是一張用來儲存字串hash值的BitMap.
2:可能還有一些細節問題,如重複的字串導致的重複計算等要考慮一下。
9)一個詞典,包含N個英文單詞,現在任意給一個字串,設計演算法找出包含這個字串的所有英文單詞。
給輸入字串,利用字母建立倒排索引,索引中儲存該字母出現在哪個單詞以及在單詞中位置;查詢時,利用倒排找到所有單詞,並求交集並且位置要連續。
大資料題目思路總結