在面試中我們會經常遇到和海量資料處理相關的問題,在這裡我們將問題進行乙個彙總,保證將來我們在遇到海量資料相關問題的時候能夠快速解答。
改文章參考:
如果記憶體能夠全部裝下:直接使用快速排序。
如果記憶體不能夠全部裝下:先將第乙個位元組,也就是前8位進行分桶,可以分為256個桶,也就是將100億的整數分別按照第乙個位元組的大小裝入這256個桶(桶是外接檔案)之中;如果記憶體仍然不能夠全部裝下中位數所在桶中的全部資料,那再將該桶按照第二個位元組的大小進行劃分,也就是在已經分了256個桶的基礎上再分256個桶。按照這種邏輯,直到記憶體能夠將中位數所在的桶全部裝下,然後進行快速排序即可。
ip位址是有限的,也就是 232 個,所以可以將所有的ip位址都存入雜湊表之中,再將海量的日誌資料讀取進入記憶體統計ip位址出現的頻率即可,統計完之後即可找出訪問次數最多的ip。
如果不能將所有ip位址存入記憶體,那麼按照前8位(也就是第乙個位元組)劃分成256個桶(如果記憶體仍然不能夠裝下那麼就將第二個位元組也劃分桶),分別找出每個桶最高頻ip,然後再在256個ip中挑選最高頻的ip 。
首先對所有的檢索串進行乙個預處理,也就是統計不同串的詞頻;然後再使用topk演算法,建立乙個小根堆,該堆的大小為10,依次將整個檢索串詞頻讀入記憶體,完成依次遍歷之後也就能找到頻率最高的10個檢索串。時間複雜度為o(nlogk),空間複雜度為o(k),k為10。
建立儲存100個詞的最小堆,然後依次讀取1g大小的檔案即可。
在記憶體中建立雜湊表統計所有query的詞頻,然後根據詞頻使用快速/歸併/堆排序即可。
4g的記憶體不可能將檔案a或者檔案b中所有的url全部裝下,那麼我們將檔案a拆分成100份,每乙份都設定乙個雜湊表,然後依次遍歷檔案b,將共同的(或者說是雜湊表中重複的)url寫到新檔案中即可找到a,b檔案中共同的url。
將2.5億個整數分成多個檔案(保證記憶體能夠將每乙個小檔案全部裝入記憶體),劃分方式按照前8位劃分,按照第乙個位元組(前8位劃分)可以分成256個不同的檔案,可以將每乙個小檔案全部裝入記憶體,之後就能夠找出不重複的數。如果按照第乙個位元組(前8位劃分)仍然不能全部裝入記憶體,那麼就按照第二…三…個位元組劃分。
對這40億個數通過位元組進行分桶(與上一題方法類似),然後找到目標數對應的檔案桶,將整個檔案裝入記憶體後進行排序,然後通過二分查詢即可判斷該數是否存在於40億個數中。
在《程式設計珠璣》中的方法為:通過第一位為1或者0進行折半,分為兩個檔案;在將第二位,第三位為1或者0進行折半,這樣通過不斷的折半到最後就可以找到目標數是否在40億個數中。時間複雜度為o(logn)。
將海量資料劃分為多個小檔案,找出每乙個小檔案中重複次數最多的那乙個,最後彙總即可找到海量資料中重複次數最多的那乙個。
演算法 海量資料
目錄 公共部分 王道程式設計師求職寶典 兩個檔案共同的url hash 分治 頻率最高 王道程式設計師求職寶典 按頻率排序多個檔案中的query記錄 hash 分治 王道程式設計師求職寶典 找出檔案中頻率最高的100個詞 top k hash 分治 中位數 bat面試經典題 100億個整數的中位數 ...
演算法之海量資料處理
1.雜湊 分治 尋找共同的url 給定兩個a和b檔案,各存放50億個url,每個url佔64位元組,記憶體限制4gb,請找出a和b檔案中共同的url。乙個檔案的記憶體 5 000 000 000 64 320gb,每個檔案可以分為100個小檔案,每個檔案大約是3.2gb。1000萬個字串去重 假設每...
海量資料處理
1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...