100億資料找出最大的1000個數字

2021-08-01 07:56:12 字數 653 閱讀 9169

這是網際網路領域乙個比較經典的演算法問題(top k),如何在巨大的資料中找出最大,或者訪問量最高的前10個,前100個或者前1000個資料。比如在2億使用者記錄中找出信用等級最高的,在上億個搜尋詞彙中找出被搜尋次數最高的10個關鍵字。前提是資料儲存在檔案中

一般遇到這個問題,第一反應會想到排序,但是稍微對記憶體有點了解的人立刻都會否定這個答案,大量的資料匯入記憶體且不說記憶體夠不夠,就算足夠伺服器上其他的服務都不需要記憶體了嗎?那麼接下來的思路就是,如果不允許全部匯入記憶體,還要找出最大的1000個數字,那就要用到外部排序(選擇)的演算法了。

解決的思路有下面幾個:

1.採用小頂堆演算法,我們知道完全二叉樹有幾個非常重要的特性,就是假如該二叉樹中總共有n個節點,那麼該二叉樹的深度就是log2n,對於小頂堆來說移動根元素到 底部或者移動底部元素到根部只需要log2n,相比n來說時間複雜度優化太多了(1億的logn值是26-27的乙個浮點數)。基本的思路就是先從檔案中取出1000個元素構建乙個小頂堆陣列k,然後依次對剩下的100億-1000個數字進行遍歷m,如果m大於小頂堆的根元素,即k[0],那麼用m取代k[0],對新的陣列進行重新構建組成乙個新的小頂堆。這個演算法的時間複雜度是o((100億-1000)log(1000)),即o((n-m)logm),空間複雜度是m

這個演算法優點是效能尚可,空間複雜度低,io讀取比較頻繁,對系統壓力大。

100億資料找出最大的1000個數字

轉於 1 最容易想到的方法是將資料全部排序。該方法並不高效,因為題目的目的是尋找出最大的10000個數即可,而排序卻是將所有的元素都排序了,做了很多的無用功。2 區域性淘汰法。用乙個容器儲存前10000個數,然後將剩餘的所有數字一一與容器內的最小數字相比,如果所有後續的元素都比容器內的10000個數...

100億個整數,找出中位數

100億個整數,記憶體足夠,如何找到中位數?記憶體不足,如何找到中位數?1 當記憶體足夠時 採用快排,找到第n大的數。隨機選取乙個數,將比它小的元素放在它左邊,比它大的元素放在右邊 如果它恰好在中位數的位置,那麼它就是中位數,直接返回 如果小於它的數超過一半,那麼中位數一定在左半邊,遞迴到左邊處理 ...

10億資料中取最大的100個資料

思路1 利用堆排序實現 1 取前m個元素 例如m 100 建立乙個小頂堆。保持乙個小頂堆得性質的步驟,執行時間為o lgm 建立乙個小頂堆執行時間為m o lgm o m lgm 2 順序讀取後續元素,直到結束。每次讀取乙個元素,如果該元素比堆頂元素小,直接丟棄。如果大於堆頂元素,則用該元素替換堆頂...