海量數據

倒排索引算法

    經過關鍵詞找內容:key->value,value是找到的全部內容的索引鏈表或者是樹,按照批評度排列數組

 

Trie樹   (前綴索引)數據結構

    字典樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用於統計和排序大量的字符串(但不只限於字符串),因此常常被搜索引擎系統用於文本詞頻統計。它的優勢是:最大限度地減小無謂的字符串比較,查詢效率比哈希表高。函數

    再海量數據查找過程當中,時間複雜度與海量數據無關,只與查找數據長度有關可視爲O(1)搜索引擎

    Trie的核心思想是空間換時間。利用字符串的公共前綴來下降查詢時間的開銷以達到提升效率的目的。 url

經過雙數組表示法能夠簡化空間複雜度 spa

 

Bloom Filter.net

    用一個大數組保存0/1,用幾個hash函數處理存儲的數據。日誌

    如何選擇數組長度和hash函數次數是須要提早預算的。blog

 

Skip List 跳錶

    實現簡單(相比紅黑樹),時間複雜度O(lgn), 適合並行計算(紅黑樹不適合)

 

MD5, 判斷惟一性,防修改等

 

如何有效合併兩個文件:一個是1億條的用戶基本信息,另外一個是用戶天天看電影連續劇等的記錄,5000萬條。其中內存只有1G。

顯然內存不能同時存下全部的數據,因此考慮分而治之的思想。
假設1K Byte能夠保存一個用戶的基本信息和看電影記錄。咱們能夠將基本信息和看電影記錄都按照hash(user_name)%100的餘數各分紅100個小文件。利用1G內存,咱們能夠每次只處理一對小文件,而後將結果輸出到一個文件中便可。
在處理一對小文件時,能夠利用key爲用戶名的hash_map將基本信息和看電影記錄合併在一塊兒。

 

 

有1到10w這10w個數,去除2個並打亂次序,如何找出那兩個數?

方法1:

申請10w個bit的空間,每一個bit表明一個數字是否出現過。
開始時將這10w個bit都初始化爲0,表示全部數字都沒有出現過。
而後依次讀入已經打亂循序的數字,並將對應的bit設爲1。
當處理完全部數字後,根據爲0的bit得出沒有出現的數字。

方法2:

首先計算1到10w的和,平方和。
而後計算給定數字的和,平方和。
兩次的到的數字相減,能夠獲得這兩個數字的和,平方和。
因此咱們有
x + y = n
x^2 + y^2 = m
解方程能夠獲得x和y的值。

 

給定a、b兩個文件,各存放50億個url,每一個url各佔用64字節,內存限制是4G,如何找出a、b文件共同的url?

海量日誌數據,提取出某日訪問百度次數最多的那個IP?

https://my.oschina.net/u/3705388/blog/1612961

 

在100w個數中找最大的前100個數

應該使用某種數據結構保存迄今最大的100個數。每讀到一個新數時,將新數和保存的100個數中的最小一個相比較,若是新數更大些,則替換。這樣掃描一遍100w個數也就得到了最大的100個數。
對於保存的100個數的數據結構,應該在最小複雜度的條件下知足
1)能夠得到最小的數;
2)將最小數替換爲另外一個數後能夠從新調整,使其能夠知足條件1。
可見小根堆能夠知足這些條件。
因此應該採用小根堆+掃描的方法。

 

在一個文件中有 10G 個整數,亂序排列,要求找出中位數。內存限制爲 2G。

不妨假設10G個整數是64bit的。
2G內存能夠存放256M個64bit整數。
咱們能夠將64bit的整數空間平均分紅256M個取值範圍,用2G的內存對每一個取值範圍內出現整數個數進行統計。這樣遍歷一邊10G整數後,咱們便知道中數在那個範圍內出現,以及這個範圍內總共出現了多少個整數。
若是中數所在範圍出現的整數比較少,咱們就能夠對這個範圍內的整數進行排序,找到中數。若是這個範圍內出現的整數比較多,咱們還能夠採用一樣的方法將此範圍再次分紅多個更小的範圍(256M=2^28,因此最多須要3次就能夠將此範圍縮小到1,也就找到了中數)。

 

求一個論壇的在線人數,假設有一個論壇,其註冊ID有兩億個,每一個ID從登錄到退出會向一個日誌文件中記下登錄時間和退出時間,要求寫一個算法統計一天中論壇的用戶在線分佈,取樣粒度爲秒。

一天總共有 3600*24 = 86400秒。
定義一個長度爲86400的整數數組int delta[86400],每一個整數對應這一秒的人數變化值,可能爲正也可能爲負。開始時將數組元素都初始化爲0。
而後依次讀入每一個用戶的登陸時間和退出時間,將與登陸時間對應的整數值加1,將與退出時間對應的整數值減1。
這樣處理一遍後數組中存儲了每秒中的人數變化狀況。
定義另一個長度爲86400的整數數組int online_num[86400],每一個整數對應這一秒的論壇在線人數。
假設一天開始時論壇在線人數爲0,則第1秒的人數online_num[0] = delta[0]。第n+1秒的人數online_num[n] = online_num[n-1] + delta[n]。
這樣咱們就得到了一天中任意時間的在線人數。

 

 

給定一個單詞a,若是經過交換單詞中字母的順序能夠獲得另外的單詞b,那麼定義b是a的兄弟單詞。如今給定一個字典,用戶輸入一個單詞,如何根據字典找出這個單詞有多少個兄弟單詞? 使用hash_map和鏈表。  首先定義一個key,使得兄弟單詞有相同的key,不是兄弟的單詞有不一樣的key。例如,將單詞按字母從小到大從新排序後做爲其key,好比bad的key爲abd,good的key爲dgoo。  使用鏈表將全部兄弟單詞串在一塊兒,hash_map的key爲單詞的key,value爲鏈表的起始地址。  開始時,先遍歷字典,將每一個單詞都按照key加入到對應的鏈表當中。當須要找兄弟單詞時,只需求取這個單詞的key,而後到hash_map中找到對應的鏈表便可。  這樣建立hash_map時時間複雜度爲O(n),查找兄弟單詞時時間複雜度是O(1)。

相關文章
相關標籤/搜索