1.100億條資料,讓找出出現次數最多的前k條記錄?
● 直接遍歷統計比較
● 排序
● 將大檔案分割
2.有40億個不重複的整數,快速檢測乙個資料是否在該集合中
● 直接遍歷
● 排序
●切割-----雜湊切割
● 位圖:用乙個位元位的狀態表示資料存在與否的狀態資訊(0,1)
(2^32)bit = (2^32/8)byte = (2^29)byte/(2^10(變成t)×2^10(變成兆))=512兆
對映:資料範圍不一定是從0開始的;若從0開始,直接對映;否則需要將資料範圍中的每個資料-100再對映;比如資料範圍[100,200)。
查詢:直接到位置中檢測對應位元位是否為1------> o(1)
置一:0010 1101
綜合可得:將其與0001 0000(對0進行左移操作)進行或操作
位操作:
| 或 || 或
& 與 && 且
^ (異或)
<< 左移 >> 右移
~ 取反
置零:0011 1101
綜合可得:將其與1110 1111 進行與操作
tip:求五個位元組資料的二進位制格式中總共有多少個1 ?
#include
#include
#include
using
namespace std;
void
testbitset()
intmain()
位圖缺點:無法處理重複的數字,只能處理存不存在之類的問題----對其進行變形操作。
1. 給定100億個整數,設計演算法找到只出現一次的整數?
位圖:用1個位元位表示資料狀態
1.將資料對映到位圖(2個位元位代表資料的狀態)中
if(00
)01elseif(
01)10
2.從改變之後的點陣圖中找只出現一次的資料從前往後兩個兩個位元位檢測
if(01)
cout<<」是只出現一次的資料」<從最高位元位開始,按照每個位元位進行劃分,直到劃分到不能再劃分(只有乙個位元位時)結束劃分;找到存在乙個數字的位置。
2.給兩個檔案,分別有100億個整數,我們只有1g記憶體,如何找到兩個檔案交集?
法一:
法二:
法三:
3. 位圖應用變形:1個檔案有100億個int,1g記憶體,設計演算法找到出現次數不超過2次的所有整數。
data ----> data/4 ----> 找到位元組data%4 *2 —>找到位元位
if(00
) 變成01
elseif(
01)變成10
elseif(
10)變成11
4. 給兩個檔案,分別有100億個query,我們只有1g記憶體,如何找到兩個檔案交集?可不可以用位**決,原因?
tip:位圖不能處理-----> 可選用布隆過濾器、雜湊切割…
位圖只能處理帶有明確資料的海量資料
海量資料處理 題目
問題例項 給你a,b兩個檔案,各存放50億條url,每條url占用64位元組,記憶體限制是4g,讓你找出a,b檔案共同的url。如果是三個乃至n個檔案呢?根據這個問題我們來計算下記憶體的占用,4g 2 32大概是40億 8大概是340億,n 50億,如果按出錯率0.01算需要的大概是650億個bit...
面試題 海量資料處理相關題目
做騰訊tsa比賽時,遇到海量資料的問題,工作站54g記憶體,把原始資料讀進去各種操作後生成特徵,再訓練導致崩掉。後來只能把特徵做好後存成檔案,需要用的時候再讀進去,省去了生成的中間環節檔案。為了確保記憶體受得住,把特徵按照天來存,最終總算是可以順利訓練和 了。記憶體總是不夠的。對於海量資料處理的策略...
海量資料處理題目小結
解決這類題目的思路一般為 1 能否用特殊的資料結構解決 位圖,布隆,堆。2 雜湊切分 1。給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址 思路分析 1.要進行雜湊切分編號,log file可以看做是字串,利用雜湊字串轉換演算法進行轉換,轉換成整型...