前幾天,面試了一家公司,其中出了一道演算法應用題,題是這樣的: 有100個檔案,每個檔案裡有10000個資料,選出前100個大的資料;
聽到這麼大的資料,第乙個想法就是 堆排,因為這個題很符合堆排的條件: (1)大資料 (2)選擇前多少個
當我說出堆排的時候,自己也有在想,這麼多的資料,能不能一下全部讀入呢,,如果全部讀入,要用多少空間來儲存???
之後,面試官提醒我,利用 歸併 的思想,最後下來查了一下,也是
對於海量的資料,必須要有乙個思想: 首先分塊處理,再合併。
(1)在每個檔案的內部進行排序,找出前100個大的資料; 這就是先分塊處理;對於為什麼要找出前100個,而不是最大的乙個,大家有沒有想過,,如果說,這100個大的資料都在乙個檔案裡面呢,,所以必須要找出每個檔案的前 100 個大的;
(2)再將這100個檔案的前100個大的進行比較;
這兩步下來,我們就把10000個資料 縮小為 100個資料,這樣資料量就縮小為 100 * 100,
之後,還看到一種方法,叫做區域性淘汰法:
思想:該方法與排序方法類似,用乙個容器儲存前10000個數,然後將剩餘的所有數字——與容器內的最小數字相比,如果所有後續的元素都比容器內的10000個數還小,那麼容器內這個10000個數就是最大10000個數。如果某一後續元素比容器內最小數字大,則刪掉容器內最小元素,並將該元素插入容器,最後遍歷完這1億個數,得到的結果容器中儲存的數即為最終結果了。此時的時間複雜度為o(n+m^2),其中m為容器的大小,即10000。
總之,並不是所有的大資料都可以用堆排來處理,,如果有什麼更好的思路,記得告訴我,,,
海量資料中選出若干大數字的演算法
今天去面試了一家公司,被問到了這樣一道題目 如何最快的從1m資料中選出100個最大的資料。問題不在於找出最大的資料,而是在於最快的演算法。我們可以建堆來搞定這件事,比如建乙個100的小頂堆。這樣只需要和最小的比較就好了。這個大概時間複雜度為o n log 2 m 應該說這是乙個比較不錯的方案。也許還...
N個元素中選最大最小
n 個元素中選最大最小 問題描述 從n 個元素中,選出最大元素和最小元素。分析複雜度。方法 方法有三種。方法一 最笨的方法,迴圈一次找出最大的算素。再迴圈一下找到最小的。這裡2 次迴圈可以放在一起,作為小小的優化。比較次數 2 n 1 2n 2。void select max min 1 int a...
從n個數選出最大的m個的演算法比較
n m遍掃瞄 演算法基本描述 n m遍掃瞄 演算法思想 每次都掃瞄一遍陣列,取出最大元素,這樣掃瞄m遍就能得到m個最大的數 演算法複雜度 o nm 排序後取最大m個數 演算法基本描述 對n個數排序,對拍完序後的序列取m個最大的數 演算法複雜度 視排序的複雜度,一般為o nlogn 或o n 2 計數...