日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

谈从10亿个数中找出前10万个最大的

發布時間:2025/6/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谈从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万个最大的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。