解題思路:有100億個整數,乙個整數4位元組,共所佔空間:100億*4位元組 = 10g*4 = 40g;所有整數的範圍為0到42億9千萬;
需要找到只出現一次的整數,那麼我們就可以直接斷定乙個數出現的狀態就有三個-------->沒有出現,出現1次,出現1次以上。三種狀態用兩個二進位制位足以表示;
使用點陣圖的變形就可完成這個題的解答(由原來點陣圖的1個位表示乙個數,變形為2個位表示乙個數);
40億左右的整數,乙個數用兩個位表示,所佔大約1g的空間;
100億個int,占約40g的空間,要找出現次數不超過2次的所有整數,也是三個狀態------>不存在,不超過2次,超過兩次;
int 型別所能表示數的個數大約位42億9千萬;兩個二進位制位表示乙個數所需要大約1g的空間;
這道題與第乙個題是相同的;
100億個query == 320g;
(1)精確演算法:要求的是不能有誤差;
利用雜湊切分,切分為計算機能處理的大小,切成1000份,平均下來每個小檔案佔320m,也可以保證兩個檔案中相同query進入編號相同的小檔案;一次比較小檔案即可;與題2一樣;
(2)近似演算法:可以允許可忍受範圍的誤差;
利用布隆過濾器;乙個整形可以表示範圍為42億9千萬,要減小布隆的誤判,乙個數用五個位來表示,這樣就可以有效減少誤判;在保證未使用的二進位制為佔總的1/2前提下,1g記憶體,能表示1024*1024**1024*32 = 8589934592個二進位制位(即80億左右的二進位制位),(若100億個query都不相同,乙個80億是不夠表示的,可以把100億等分再佈隆)
總結
1)給乙個超過
100g
大小的log file
,log
中存著ip
位址,設計演算法找到出現次數最多的
ip位址?(與如何知道
top k的ip
,如何使用
linux
系統命令實現)
hash分桶法:
將100g檔案分成
1000
份,將每個
ipfile_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個英文單詞,現在任意給乙個字串,設計演算法找出包含這個字串的所有英文單詞。
要bloomfilter支援計數操作,每一位至少是乙個int型別的,所以點陣圖就不能作為底層進行實現了,底層需要加乙個整形陣列去實現,陣列中存放的是這一位所出現的次數;
擴充套件blommfilter支援刪除,必須在底層加乙個引用計數,使其每一位的刪除不影響別的資料;計數已經在上一題說明了思路;
大資料資料處理分析
案例1 假設乙個檔案中有9億條不重複的9位整數,現在要求對這個檔案進行排序。方法 bit 位操作 首先32位機的定址能力是 2的32次方,即4g.定址能力最大是這樣了.乙個最大的9位整數為999999999 這9億條資料是不重複的 宣告乙個bit陣列,長度為10億 一共需要10億 8 1024 10...
大資料處理
大資料處理的流程主要包括以下四個環節 採集 匯入 預處理 統計 分析 挖掘,下面針對這四環節進行簡單闡述。大資料處理之一 採集 在大資料的採集過程中,其主要特點和挑戰是併發數高,因為同時有可能會有成千上萬的使用者來進行訪問和操作,比如火車票售票 和 它們併發的訪問量在峰值時達到上百萬,所以需要在採集...
大資料處理隨筆
1.mssql當資料庫資料超過1000萬的時候超時是正常的,所以當表資料到1000萬時候注意delete 2.今天遇到資料庫時間格式2014021000 當然是int型別哦 3.聯合索引使用 開始時間與結束時間這樣一起查詢的要建成索引 4.訂閱資料庫,只可以查詢操作,這樣的話可以在這個表上面建立索引...