分而治之/hash對映 + hash統計 + 堆/快速/歸併排序;
300萬個查詢字串中統計最熱門的10個查詢。
針對此類典型的top k問題,採取的對策往往是:hashmap + 堆。
hash統計:先對這批海量資料預處理。具體方法是:維護乙個key為query字串,value為該query出現次數的hashtable,即hash_map(query,value),每次讀取乙個query,如果該字串不在table中,那麼加入該字串,並且將value值設為1;如果該字串在table中,那麼將該字串的計數加一即可。最終我們在o(n)的時間複雜度內用hash表完成了統計;
堆排序:第二步、借助堆這個資料結構,找出top k,時間複雜度為n『logk。即借助堆結構,我們可以在log量級的時間內查詢和調整/移動。因此,維護乙個k(該題目中是10)大小的小根堆,然後遍歷300萬的query,分別和根元素進行對比。所以,我們最終的時間複雜度是:o(n) + n' * o(logk),(n為1000萬,n』為300萬)。
雙層桶劃分;
2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。
類似鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個區域(比如用單個檔案代表乙個區域),然後將資料分離到不同的區域,然後不同的區域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁碟空間,就可以很方便的解決。
5億個int找它們的中位數。
思路一:首先我們將int劃分為2^16個區域,然後讀取資料統計落到各個區域裡的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。然後第二次掃瞄我們只統計落在這個區域中的那些數就可以了。
實際上,如果不是int是int64,我們可以經過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個區域,然後確定區域的第幾大數,在將該區域分成2^20個子區域,然後確定是子區域的第幾大數,然後子區域裡的數的個數只有2^20,就可以直接利用direct addr table進行統計了
思路二:同樣需要做兩遍統計,如果資料存在硬碟上,就需要讀取2次。
方法同基數排序有些像,開乙個大小為65536的int陣列,第一遍讀取,統計int32的高16位的情況,也就是0-65535,都算作0,65536 - 131071都算作1。就相當於用該數除以65536。int32 除以 65536的結果不會超過65536種情況,因此開乙個長度為65536的陣列計數就可以。每讀取乙個數,陣列中對應的計數+1,考慮有負數的情況,需要將結果加32768後,記錄在相應的陣列內。
第一遍統計之後,遍歷陣列,逐個累加統計,看中位數處於哪個區間,比如處於區間k,那麼0- k-1的區間裡數字的數量sum應該
bloom filter/bitmap;
適用範圍:可以用來實現資料字典,進行資料的判重,或者集合求交集
bloom filter將集合中的元素對映到位陣列中,用k(k為雜湊函式個數)個對映位是否全1表示元素在不在這個集合中。counting bloom filter(cbf)將位陣列中的每一位擴充套件為乙個counter,從而支援了元素的刪除操作。spectral bloom filter(sbf)將其與集合元素的出現次數關聯。sbf採用counter中的最小值來近似表示元素的出現頻率。
給你a,b兩個檔案,各存放50億條url,每條url占用64位元組,記憶體限制是4g,讓你找出a,b檔案共同的url。如果是三個乃至n個檔案呢?
根據這個問題我們來計算下記憶體的占用,4g=2^32大概是40億*8大概是320億,n=50億,如果按出錯率0.01算需要的大概是650億個bit。現在可用的是320億,相差並不多,這樣可能會使出錯率上公升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。
用位圖/bitmap
的方法,申請512m的記憶體,乙個bit位代表乙個unsigned int值。讀入40億個數,設定相應的bit位,讀入要查詢的數,檢視相應bit位是否為1,為1表示存在,為0表示不存在。
trie樹/資料庫/倒排索引;
trie樹
適用範圍:資料量大,重複多,但是資料種類小可以放入記憶體
基本原理及要點:實現方式,節點孩子的表示方式
擴充套件:壓縮實現。
乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前10個詞。
其解決方法是:用trie樹統計每個詞出現的次數,時間複雜度是o(n*le)(le表示單詞的平準長度),然後是找出出現最頻繁的前10個詞。
資料庫索引
適用範圍:大資料量的增刪改查
基本原理及要點:利用資料的設計實現方法,對海量資料的增刪改查進行處理。
倒排索引(inverted index)
適用範圍:搜尋引擎,關鍵字查詢
基本原理及要點:為何叫倒排索引?一種索引方法,被用來儲存在全文搜尋下某個單詞在乙個文件或者一組文件中的儲存位置的對映。
外排序;
適用範圍:大資料的排序,去重
基本原理及要點:外排序的歸併方法,置換選擇敗者樹原理,最優歸併樹
有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16個位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
這個資料具有很明顯的特點,詞的大小為16個位元組,但是記憶體只有1m做hash明顯不夠,所以可以用來排序。記憶體可以當輸入緩衝區使用。
海量資料處理
1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...
海量資料處理
給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...
海量資料處理
演算法思想 分而治之 hash 1.ip 位址最多有 2 32 4g種取值情況,所以不能完全載入到記憶體中處理 2.可以考慮採用 分而治之 的思想,按照 ip位址的hash ip 1024 值,把海量 ip 日誌分別儲存到 1024 個小檔案中。這樣,每個小檔案最多包含 4mb 個 ip 位址 3....