谈从10亿个数中找出前10万个最大的
談從10億個數中找出前10萬個最大的
期的實驗顯示10億個浮點數大概占據3G左右的空間,因此全部一次性讀入內存目前在個人PC上是不太現實的。本次討論不考慮內存等等,只考慮算法。
如果一次性比較排序,然后輸出前面最大的10w個,那么眾所周知,算法的時間復雜度不下于O(N lgN),此處的N為數的個數(10億)。
如果用堆排序,由于堆排序像合并排序而不像插入排序,堆排序的運行時間為O(N lgN);又想插入排序而不像合并排序,堆排序是一種原地排序。因此堆排序具有相對小的運行時間和占用相對小的額外空間的優點。
再則,利用最小堆的性質,堆頂元素是整棵樹中具有最小值的元素,因此,我們可以構建這樣的一個最小堆:
step1:取前m個元素(例如m=10萬),建立一個小頂堆
???????? 保持一個小頂堆得性質的步驟,運行時間為O(lgm);
????????? 建立一個小頂堆運行時間為m*O(lgm)=O(m lgm);
??????? 其實建立一個小頂堆實際運行時間為O(m);具體分析參考算法導論。
step2:順序讀取后續元素,直到結束
????? 每次讀取一個元素,如果該元素比堆頂元素小,直接丟棄
????? 如果大于堆頂元素,則用該元素替換堆頂元素,然后保持最小堆性質
??? 最壞情況是每次都需要替換掉堆頂的最小元素,因此需要維護堆的代價為(N-m)*O(lgm);
最后這個堆中的元素就是前最大的10W個。
??? 時間復雜度為O(N lgm)。
轉載于:https://www.cnblogs.com/watsonlong/archive/2011/03/24/1994452.html
總結
以上是生活随笔為你收集整理的谈从10亿个数中找出前10万个最大的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算简介+云计算建站平台
- 下一篇: java为窗体添加滚动条