標籤:style blog http color 使用 strong
1.hashing
適用範圍:快速尋找,刪除的基本資料結構,通常需要總資料量可以放入記憶體。
這裡的hashing和 hashmap是不一樣的概念,這裡的hash指的是hashtable,可以看例子:(比較兩個字串的包含問題) 問題執行個體:
1).海量日誌資料,提取出某日訪問百度次數最多的那個IP。
IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入記憶體,然後進行統計。
2.bitmap 適用範圍:可進行資料的快速尋找,判重,刪除,一般來說資料範圍是int的10倍以下。 疑惑:bitmap處理的資料範圍最大為多少? 將bit-map擴充一下,用2bit表示一個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上。或者我們不用2bit來進行表示,我們用兩個bit-map即可類比實現這個2bit-map。 問題執行個體:
1)已知某個檔案內包含一些電話號碼,每個號碼為8位元字,統計不同號碼的個數。
8位最多99 999 999,大概需要99m個bit,大概10幾m位元組的記憶體即可。
2)2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。
3.堆
適用範圍:海量資料前n大,並且n比較小,堆可以放入記憶體。 問題執行個體:
1)100w個數中找最大的前100個數。
用一個100個元素大小的最小堆即可。
4.雙層桶劃分----其實本質上就是【分而治之】的思想,重在“分”的技巧上! 適用範圍:第k大,中位元,不重複或重複的數字
基本原理及要點:因為元素範圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定範圍,然後最後在一個可以接受的範圍內進行。可以通過多次縮小,雙層只是一個例子。
擴充:
問題執行個體:
1).2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。
有點像鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個地區(比如用單個檔案代表一個地區),然後將資料分離到不同的地區,然後不同的地區在利用bitmap就可以直接解決了。也就是說只要有足夠的磁碟空間,就可以很方便的解決。
2).5億個int找它們的中位元。
這個例子比上面那個更明顯。首先我們將int劃分為2^16個地區,然後讀取資料統計落到各個地區裡的數的個數,之後我們根據統計結果就可以判斷中位元落到那個地區,同時知道這個地區中的第幾大數剛好是中位元。然後第二次掃描我們只統計落在這個地區中的那些數就可以了。
這個看的不是很明白。
5.倒排索引 適用範圍:搜尋引擎,關鍵字查詢
基本原理及要點:為何叫倒排索引?一種索引方法,被用來儲存在全文檢索搜尋下某個單詞在一個文檔或者一組文檔中的儲存位置的映射。
以英文為例,下面是要被索引的文本:
T0 = "it is what it is"
T1 = "what is it"
T2 = "it is a banana"
我們就能得到下面的反向檔案索引:
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
檢索的條件"what","is"和"it"將對應集合的交集。
擴充:
問題執行個體:文檔檢索系統,查詢那些檔案包含了某單詞,比如常見的學術論文的關鍵字搜尋。
6.外排序 --歸併排序
適用範圍:大資料的排序,去重
一般處理海量資料的時候,首先用hashmap分到較小的檔案中,或者是mapreduce分配到多個電腦中,然後再通過歸約來進行統計。 問題執行個體:
1).有一個1G大小的一個檔案,裡面每一行是一個詞,詞的大小不超過16個位元組,記憶體限制大小是1M。返回頻數最高的100個詞。
這個資料具有很明顯的特點,詞的大小為16個位元組,但是記憶體只有1m做hash有些不夠,所以可以用外排序。記憶體可以當輸入緩衝區使用。首先就是hashmap到不同檔案中。
7.mapreduce 8.trie樹,還需要總結
有個執行個體的解法很好,這裡貼上去
本文只是相當於筆記,便於日後複習。內容全部來自 http://blog.csdn.net/v_JULY_v/article/details/6279498
來自為知筆記(Wiz)