前兩天面試3面學長問我的這個問題(想說teg的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了),這個問題還是建立最小堆比較好一些。
先拿10000個數建堆,然後一次新增剩餘元素,如果大於堆頂的數(10000中最小的),將這個數替換堆頂,並調整結構使之仍然是乙個最小堆,這樣,遍歷完後,堆中的10000個數就是所需的最大的10000個。建堆時間複雜度是o(mlogm),演算法的時間複雜度為o(nmlogm)(n為10億,m為10000)。
優化的方法:可以把所有10億個資料分組存放,比如分別放在1000個檔案中。這樣處理就可以分別在每個檔案的10^6個資料中找出最大的10000個數,合併到一起在再找出最終的結果。
針對top k類問題,通常比較好的方案是分治+trie樹/hash+小頂堆
海量資料中找出前k大數(topk問題)
前兩天面試3面學長問我的這個問題 想說teg的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了 這個問題還是建立最小堆比較好一些。先拿10000個數建堆,然後一次新增剩餘元素,如果大於堆頂的數 10000中最小的 將這個數替換堆頂,並調整結構使之仍然是乙個最...
在海量資料中找到最大的前K個數(top K問題)
問題分析 資料是海量的,可能達到10億或者100億以上,只需要找最大的前100個數。所以將資料一次性排序然後取前100個是不太可取的操作。做了很多無用功,並且記憶體一次性也載入不了海量資料。解決方案 方案一 堆。一般說在很多資料中取前多少個資料,我們都會想到堆,這裡我們使用堆來解決問題。首先取k個數...
海量資料中找top K專題
這種題目就是分治 堆排序。為啥分治?因為數太多了,全部載入進記憶體不夠用,所以分配到多台機器中,或者多個檔案中,但具體分成多少份,視情況而定,只要保證滿足記憶體限制即可。什麼,如何分?hash num numoffiles。為啥堆排序?首先堆排序是一種選擇排序,比一般的選擇排序時間複雜度要低,額外的...