乙個 Top k 問題

2021-08-11 10:34:32 字數 925 閱讀 7295

這個問題其實是由下面這個問題引入的:

從20億個數字的文字中,找出最大的前100個。

這個問題的比較好的解決方法就是,維護 k 個元素的小根堆,用容量為 k 的最小堆儲存最先遍歷到的 k 個數,並假設它們即是最大的 k 個數,建堆費時o(k)後,假如 k1 為根,那麼有 k1 就是這 k 個元素中最小的元素)。繼續遍歷數列,每次遍歷乙個元素x,與堆頂元素比較,x>k1,更新堆(用時logk),否則不更新堆。這樣下來,總費時o(k+(n-k)*logk)=o(n*logk)。

後來看到乙個這樣的問題:

當時我的思路是這樣的:

把整個大檔案按照資料量大小平均拆分為多個小檔案。

分別計算每個小檔案裡面的 ip 出現次數。

將計算好的多個小檔案合併。

這一步就會有些問題,比如說,可能存在大量的 ip 同時存在多個小檔案裡面,那麼這個合併就需要所有的小檔案同時操作合併,那這樣,又可能超出記憶體了。

後來,諮詢了誰誰以後,恍然大悟,少了一步。

改進後的思路:

把整個大檔案按照資料量大小平均拆分為多個小檔案。

分別操作每個小檔案,將裡面的 ip 按照某個規則重新寫入到另一些檔案裡面。

比如,將 a 網段的所有 ip 輸出到乙個檔案,b 網段的所有 ip 輸入到另乙個檔案,保證同乙個 ip 只在某乙個小檔案裡面。如果 a 網段的 ip 過多,再次根據規則拆分。

分別計算上一步生成的每個小檔案裡面的 ip 出現次數。

利用小根堆算出每個小檔案裡面 ip 出現次數最多的前 k 個 ip。

合併每個小檔案的前 k 個 ip,得到最終的 k 個 ip。

可以看出,首先,根據某種規則分組使得統計的資料不會同時存在多個小檔案裡面很重要。

怎樣從10億查詢詞找出出現頻率最高的10個

十道海量資料處理面試題與十個方法大總結

TopK問題詳解

1.基本topk問題描述 從1百萬個數中找出最大 或最小 的5個數 看到這個問題,很多同學的第一反應會是 排序。那麼,選擇哪種排序方法呢,有同學說 快排,將所有數排序後,再選出最大的5個。雖然快排確實能解決這個問題,但是需要對1百萬個數排序,但我們僅僅需要其中的5個。那麼,有更好的方法嗎?還記得我們...

Top K問題詳解

最容易想到的方法是將資料全部排序,然後在排序後的集合中進行查詢,最快的排序演算法的時間複雜度一般為o nlogn 如快速排序。但是在32位的機器上,每個float型別佔4個位元組,1億個浮點數就要占用400mb的儲存空間,對於一些可用記憶體小於400m的計算機而言,很顯然是不能一次將全部資料讀入記憶...

TOPk系列問題

找出陣列中最小 最大 的k個數。以任意順序返回這k個數。1.若該陣列的陣列長度很小,則可運用簡單方法查詢即可。2.若該陣列陣列長度很大,超過了記憶體能儲存的範圍。那麼,顯而易見,傳統的查詢方法已經失去的查詢的能力。a.最大前k個數,建小堆 b.最小前k個數建大堆 示例 建小堆 向下調整演算法 voi...