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