數據結構:大數據處理問題

1.給定100億個整數,設計算法找到只出現一次的整數?

①方法一
100億個整數就是400億個字節,42億九千萬是4G,那麼1G就是10億字節,所以要存下100億個整數需要40G的內存空間。因此我們採用位圖100億個整數大概就是1G,但是使用位圖,需要用兩個位標識一個數字(兩個位可以標識四種狀態),沒有出現過爲00,出現一次爲01,出現兩次及以上爲10,11可以丟棄。所以2G空間就夠了。
那麼現在我們要找到只出現一次的整數就找到位圖中映射01的那個數據即可。

②方法二
採用兩個位圖,每個位圖是1G的大小,兩個位圖對應的位標識一個數據,兩個位圖對應的位都是0表示沒有出現過;第一個位圖對應位0,第二個位圖對應位1則表示這個數只出現了一次;第一個位圖對應位1,第二個位圖對應位0則表示這個數出現了兩次或兩次以上。

2.給兩個文件,分別有100億個整數,我們只有1G內存,如何找到兩個文件的交集?

①方法一
我們開一個位圖,把第一個文件中的數字set到位圖中,用第二個文件進行查找test,如果第二個文件中的數據在位圖中被找到了,那麼這個數就是交集的一份子,當把第二個文件中的數據查找完時就可以找到交集了。

②方法二
開兩個位圖,把文件1的數據set到位圖1中,把文件2的數據set到位圖2中,然後把兩個位圖進行與操作,那麼與出來的結果位圖中對應位爲1的位所對應的數據的集合就是交集。

3.一個文件有100億個int,1G內存,設計算法找到出現次數不超過2次的所有整數?

出現次數不超過2次的所有整數,一共有四種狀態,因此需要用兩個位來進行標識,00標識沒有出現,01表示出現一次,10表示出現兩次,11表示出現兩次以上。找出現次數不超過2次的就是查找對應標識位爲00,01,10的數據。

4.給兩個文件,分別有100億個query,我們有1G內存,如何找到這兩個文件的交集?分別給出精確算法和近似算法。

①近似算法
使用布隆過濾器,把文件1的query全部set到布隆過濾器裏,然後用文件2的query進行test操作,如果返回true則說明這個query是交集的一份子,那麼查找完就可以找出交集。
這樣使用布隆過濾器可能會有誤判,所以這個是近似算法。

②精確算法
假設每個query是40字節,那麼一個文件的大小就是400G,此時把這個文件哈希切成1024份(注意:這裏切多少份是要根據實際情況來定的,比如我是400G,切成1000多份,那麼每一份大概就是400M,400M對內存來說是足夠的)。
在這裏插入圖片描述
我們把文件A和文件B都切分成1024份小文件,切分採用的是哈希切分,如上圖所示,用hash算法計算出來的num是多少就進入多少號小文件,然後將A和B文件對應的小文件進行找交集即可,因爲是哈希切分,所以如果A文件和B文件如果有相同的query那麼用同樣的哈希算法就會讓這兩個相同的query分別進入A和B相同num的小文件裏,所以在進行查找交集的時候只需要A0找B0,A1找B1這樣子找下去。

查找小文件的交集時,可以把Anum的query映射到哈希表裏,然後用Bnum的query去查找看有沒有,如果有那麼這個query就是交集的一份子,如果沒有說明這個query不是交集的一份子。

5.布隆過濾器如何支持刪除

如何支持
採用引用計數,但是採用引用計數刪除的話就需要進行儲存這個計數,需要額外的空間,會增大佔用內存的大小。使用引用計數就是有多個值同時映射這個位,就把這個位的引用計數++,刪除時就–,然後判斷是否存在則是看值是否大於0。

引用計數開多大
那麼這個引用計數開多少個字節呢?如果給一個字節,八個位,那最多就是有256個值映射同一個位置,那麼少量數據還可以,如果是幾百億的數據的話,這個引用計數就是不夠的。那如果給兩個字節,16個位,那最多就可以有65535個值同時映射同一個位。如果給四個字節,32個位,那最多就可以有42億九千萬個值同時映射同一個位。所以引用計數開多少字節要根據實際情況來確定。

舉例
假如用兩個位來記錄引用計數時,我們可以這樣設計:vector<short> bits,也就是如果要設置(set)對應的位時,不採用置1操作,採用的是++操作,那麼有值要進行映射時,對應位++即可。要刪除(reset)對應的映射關係時,對應位的值–即可。如果要看在不在(test)時,那麼直接看對應的映射位是不是0即可,如果是0則說明不在,如果是非零則說明在。

6.給一個超過100G大小的log文件,裏面存着IP地址,設計算法找到次數最多的IP地址?

這個題看到之後我們就會知道這是top K問題,那麼這個題要統計次數,首先想到map或者unorderd_map,key是IP地址,value是次數,但是100G的文件加載不到內存中去,所以我們採用哈希切分。
在這裏插入圖片描述
將log文件哈希切分成1024份,那麼相同的IP地址就會進入編號相同的小文件裏,那麼我們只需要統計每個小文件裏相同的IP地址出現的次數即可,因爲相同的ip地址一定會進入同一個小文件。這裏一個小文件大概就是100M,加載到內存中採用map或者unorderd_map統計次數即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章