轉知乎,手敲一遍,加深記憶
箴言:無論是這些海量資料處理面試題也好,還是演算法也好,面試時,70~80%的人不是倒在這兩方面,而是倒在基礎之上(諸如語言,資料庫,作業系統,網路協議等等),所以,無論任何時候,基礎最重要,沒了基礎,便什麼都不是。
何謂海量資料處理?
無非就是基於海量資料上的儲存,處理,操作。海量就是資料量太大。導致要麼無法再較短時間解決,要麼是資料太大,無法一次性裝入記憶體。
解決方案:
針對空間:無非就是大而化小,分而治之(hash對映),不就是規模大嘛,我就化成小的,各個擊破。
關於單機和集群問題:
通過另一篇:big data processing,知道,處理海量資料無非就是:
分而治之/hash對映 + hash統計 + 堆/快速/歸併排序
雙層桶劃分
bloom filter/bitmap
trie樹/資料庫/倒排索引
外排序分布式處理之hadoop/mapreduce
本文第一部分:從set/map到hashtable/hash_map/hash_set,介紹set/map/multiset/multimap以及hash_set/hash_map。hash_mulitset/hash_multimap之間的區別,這是基礎,基礎才是根本!!!
第一部分:從set/map到hashtable/hash_map/hash_set
stl容器分為:
序列式容器
關聯式容器:
又分為set集合和map對映表兩大類。
以及這兩大類的衍生體:multiset多鍵集合和multimap多鍵對映表,這些容器在底層都是rb-tree完成。
此外還有三類關聯式容器,如hashtable雜湊表,以及以hashtable為底層機制完成的hash_set雜湊集合和hash_map雜湊對映表hash_multiset雜湊多鍵集合和hash_multimap雜湊多鍵對映表
總結:set/map/multiset/multimap都內含乙個rb-tree
hash_set/hash_map/hash_multiset/hash_multimap都內含乙個hashtable
所謂的關聯式容器,類似關聯式資料庫,每筆資料或者每個元素都有乙個key和乙個實值value,也就是key-value鍵值對。
當元素被插入到關聯式容器中,容器內部結構rb-tree、hashtable便按照其鍵值大小,以某種規則將這個元素置於適當的位置。
set/map:
相同:所有元素都會根據元素的鍵值自動被排序,因為set/map兩者的所有各種操作,都只是轉而呼叫rb-tree的操作行為,不過,兩者都不允許兩個元素有相同的鍵值
不同::set的元素不像map那樣可以同時擁有實值(value)和鍵值(key),set元素的鍵值就是實值,實值就是鍵值,而map的所有元素都是pair,同時擁有實值(value)和鍵值(key),pair的第乙個元素被視為鍵值,第二個元素被視為實值。
multiset/multimap:
他們的特性及用法和set/map完全相同,唯一的差別就在於它們允許鍵值重複,即所有的插入操作基於rb-tree的insert_equal()而非insert_unique()。
hash_set/hash_map/hash_multiset/hash_multimap:
hash_set/hash_map,兩者的一切操作都是基於hashtable之上。不同的是,hash_set同set一樣,同時擁有實值和鍵值,且實質就是鍵值,鍵值就是實值,而hash_map同map一樣,每乙個元素同時擁有乙個實值(value)和乙個鍵值(key),所以其使用方式,和上面的map基本相同。但由於hash_set/hash_map都是基於hashtable之上,所以不具備自動排序功能。為什麼?因為hashtable沒有自動排序功能。
hash_multiset/hash_multimap的特性與上面的multiset/multimap完全相同,唯一的差別就是它們hash_multiset/hash_multimap的底層實現機制是hashtable(而multiset/multimap,上面說了,底層實現機制是rb-tree),所以它們的元素都不會被自動排序,不過也都允許鍵值重複。
綜上,說白了,什麼樣的結構決定其什麼樣的性質,因為set/map/multiset/multimap都是基於rb-tree之上,所以有自動排序功能,而hash_set/hash_map/hash_multiset/hash_multimap都是基於hashtable之上,所以不含有自動排序功能,至於加個字首multi_無非就是允許鍵值重複而已。
第二部分、處理海量資料問題之六把密匙
2、尋找熱門查詢,300萬個查詢字串中統計最熱門的10個查詢
3、有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
4、海量資料分布在100臺電腦中,想個辦法高效統計出這批資料的top10。
5、有10個檔案,每個檔案1g,每個檔案的每一行存放使用者的query,每個檔案的query都可能重複。要求你按照query的頻度排序。
6、 給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?
7、怎麼在海量資料中找出重複次數最多的乙個?
9、乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間複雜度分析。
10. 1000萬字串,其中有些是重複的,需要把重複的全部去掉,保留沒有重複的字串。請怎麼設計和實現?
11. 乙個文字檔案,找出前10個經常出現的詞,但這次檔案比較長,說是上億行或十億行,總之無法一次讀入記憶體,問最優解。
12. 100w個數中找出最大的100個數。
多層劃分:
其實本質上還是分而治之的思想,重在「分」的技巧上!
適用範圍:
第k大,中位數,不重複或重複的數字
基本原理及要點:
因為元素範圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定範圍,然後最後在乙個可以接受的範圍內進行。
13、2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。
14、5億個int找它們的中位數。
mapreduce是一種計算模型,簡單的說就是將大批量的工作(資料)分解(map)執行,然後再將結果合併成最終結果(reduce)。這樣做的好處是可以在任務被分解後,可以通過大量機器進行平行計算,減少整個操作的時間。但如果你要我再通俗點介紹,那麼,說白了,mapreduce的原理就是乙個歸併排序。
經過上面這麼多海量資料處理面試題的轟炸,我們依然可以看出這類問題是有一定的解決方案/模式的,所以,不必將其神化。然這類面試題所包含的問題還是比較簡單的.
無論是這些海量資料處理面試題也好,還是演算法也好,面試時,70~80%的人不是倒在這兩方面,而是倒在基礎之上(諸如語言,資料庫,作業系統,網路協議等等),所以,無論任何時候,基礎最重要,沒了基礎,便什麼都不是。
海量資料面試題
海量資料面試題 1 給個超過100g的logfile,log中存著ip位址,設計演算法找到出現次數最多的ip位址?第一題 首先我們的思路就是利用雜湊進行檔案的切分,我們把100g大小的logfile分為1000份,那麼下來差不多沒乙個檔案就是100m左右,然後再利用雜湊函式除留餘數的方法分配到對應的...
海量資料面試題
給乙個超過100g大小的log le,log中存著ip位址,設計演算法找到出現次數最多的ip位址?思路 1 使用雜湊切割 將100g大小的檔案分成1000分小檔案 2 使用 hashstr ip 1000 將每個檔案上的ip位址對映到雜湊表中 然後將ip位址轉化成整數形式 3 使用key value...
海量資料面試題
方案1 可以估計每個檔案安的大小為50g 64 320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。s 遍歷檔案a,對每個url求取clip image002,然後根據所取得的值將url分別儲存到1000個小檔案 記為clip image004 中。這樣...