本文簡要總結了一下海量數據處理的常見方法和思路。總結的比較粗糙,主要做爲知識提綱使用。請各位高手不吝賜教。算法
另外,最近在BAE上學習用 WordPress 搭建了獨立博客,歡迎你們有空去轉轉!本博客文章將同步更新。數組
博客地址:http://panwenhai.duapp.com/app
一、海量數據處理整體思路:分配任務、單獨解決、合併結果
- 分配任務:
- 單獨解決:
- 統計各個元素出現的次數:Hash Map,N-Bit Map,Trie-Tree,倒排索引
- 找尋最大(小)的N個元素:堆結構,快排思想,局部淘汰法
- 查找給定元素是否存在在其中:Hash Map,1-Bit Map,Bloom Filter,高位比較
- 尋找中位數:桶劃分思想
- 搜索引擎,查找關鍵字:倒排索引
- 合併結果:
二、分而治之+Hash
- 經過Hash取模的方法( Hash(ip)%1024 ),將大量數據分紅一個一個的小文件,再進行處理(內排序)。
- Hash取模的方法,使得相同的元素,會被分配到相同的文件中,對於單獨文件操做,就能夠獲得對應元素的結果。
- 處理以後,採用歸併的方法,對於小文件的結果進行合併,從而獲得最終結果(外排序)。
- 當數據量較大,而又必須進行完全的處理時,能夠採用這種思想
三、Hash Map
- 經過一次掃描,能夠創建Key與Value對的hash表,來統計某個元素出現的次數。
四、N-Bit Map 位圖方法
- 與 Hash Map 類似,只是Key一般爲元素值進行直接索引,value值爲bit串,用來記錄某個元素的狀態。
- N的大小控制bit串長度,用來控制狀態的總數。(如:N=2時,00表示不存在,01表示出現一次,10表示出現屢次,11無心義)
- Bit Map 自己的長度,表示可記錄元素的個數
- 當N = 1,採用元素值做爲地址直接索引時,能夠表示40億個不重複的unsigned int值是否存在。
五、Bloom Filter
- 有必定錯誤機率,但相比於單純的bit_set節省空間。
- bit_set + k個獨立hash函數:將hash函數的結果做爲索引值,將對應位置1。查找元素時,若是發現K個hash函數所獲得的位置都是1,則認爲對應元素存在。
- 輸入元素個數n,肯定位數組m的大小及hash函數個數
- m應該>=nlg(1/E)*lge
- k=(ln2)*(m/n)
- Bloom Filter:元素 映射爲 位數組
- Counting Bloom Filter:在Bloom filter 中的位擴展爲 counter,支持刪除操做。
- Spectral Bloom Filter:將元素與出現次數關聯。
六、堆結構
- 經過堆的特性,找尋出現最多(少)的前N個元素。
- 須要先統計出各個元素出現的次數(能夠用Hash Map),這一步只是找前N個。
- 找最多,用小頂堆,找最大,用大頂堆(先比較堆頂元素,若是不知足要求,則直接輪詢下一個,若是符合要求,插入堆中)
- 時間複雜度O(X log Y),X爲全部元素的個數,Y爲堆中元素的個數
- 擴展:雙堆,一個大頂堆和一個小頂堆,能夠用來維護中位數。大頂堆存儲較小的一半數字,小頂堆存儲較大的一半數字。每次插入元素後,適當移動根節點保持兩個堆數字相等或相差1.
七、Trie 樹
- 前綴樹,統計各個單詞出線的次數。
- 每一個節點都是一個字母,前綴相同的,就不新建節點了。節點的內容是這個單詞出現的次數。
- 時間複雜度: O(n*le)(le表示單詞的平準長度)
八、快排思想找前N個元素
- 利用快速排序思想,每次分割時,僅考慮知足要求的一些,當接近N時,採用普通排序算法排序。
九、局部淘汰法找前N個元素
- 從全部數據中,選取前N個元素,排序。而後掃描剩餘元素,與排好序的最後一個元素相比,若是比它小(大),則刪除最後一個元素,利用插入排序法的思想插入序列中。
- 時間複雜度:O(100w*100)
十、MapReduce思想
- 在用分而治之hash分配任務後,並不一個一個文件進行處理,而是採用分佈式的方法,同時處理多個文件,在處理以後,再進行合併。
十一、桶劃分
- 本質上是分而治之,重在「分」的技巧
- 劃分元素的取值範圍,將落在一個範圍內的元素分紅一組
- 單獨處理每一組的元素,最終合併結果
- 如:找中位數,將int劃分紅2^16個區域,統計在各個區域內的數字個數,就能夠判斷出在哪一個區域的第幾個元素就是中位數。而後對那個區域內的元素排序便可得到
十二、高位比較
- 從不少數中,查找某一個數字是否出現過。
- 由最高位開始比較,0,1二分,以後依次類推。近似於折半查找。O(logn)
1三、倒排索引