給乙個基於最小二叉堆的方案:
第一階段,向最小二叉堆中插入前一萬個浮點數;
第二階段,從第一萬零乙個浮點數開始,將之與最小二叉堆頂部的最小值比較。如果小於這個最小值,把最小值彈出並將新值插入到二叉堆中。重複此過程直到遍歷完成。
. 建立長度一萬的二叉樹。
2. 遍歷剩餘的浮點數,若大於最小值則插入二叉樹並刪除最小的節點,否則略過。
這基本上是乙個較優的演算法,複雜度為: 千萬級(一萬的排序) + 140億(插入二叉樹)
從上面的粗略計算可以知道,二叉樹的插入是最耗時的,因此如果能提前確定乙個盡可能大初始陣列則可能大大減少比較次數。
所以有必要對原始資料進行一些預算:
1. 將所有資料進行分組
2. 計算各組平均值
3. 對平均值排序
3. 以最大的做為初始陣列,建立有序二叉樹
4. 以平均值從大到小的順序往初始二叉樹中插入
這樣就有可能避免很大比例的比較運算,當然對是否值得進行預算,以及預算到什麼程度還需要根據原始資料的情況而定
1萬個數快排.
剩下的數中取乙個與之前資料中最小的比較.如果大於,做排入排序.直到取完剩餘的數
使用鍊錶
維護乙個小到大排序的鍊錶。每讀乙個就按大小插入到鍊錶中相應位置。達到10000個後,每插入乙個,就刪除鍊錶的第乙個,小於第乙個節點的資料忽略。
選擇問題,nth_element (stl source code)
10億浮點數求最大的一萬個
這兩天在網上淘到一道筆試題目 注1 雖然真假未知,但的確是道好題,題目如下 從10億個浮點數中找出最大的1萬個。這是一道似易實難的題目,一般同學最容易中的陷阱就是沒有重視這個 億 字。因為有10億個單精度浮點數元素的陣列在32位平台上已經達到3.7gb之巨,在常見計算機平台 如win32 上宣告乙個...
有10億個浮點數,從中找出1萬個最大的數。
給乙個基於最小二叉堆的方案 第一階段,向最小二叉堆中插入前一萬個浮點數 第二階段,從第一萬零乙個浮點數開始,將之與最小二叉堆頂部的最小值比較。如果小於這個最小值,把最小值彈出並將新值插入到二叉堆中。重複此過程直到遍歷完成。建立長度一萬的二叉樹。2.遍歷剩餘的浮點數,若大於最小值則插入二叉樹並刪除最小...
10億個浮點數,求出其中最大的10000個
include stdafx.h include include include include for greater using namespace std int tmain int argc,tchar argv cout bigs.size endl make heap bigs.begi...