一些海量數據排序算法問題總結

1.給2000千萬高考學生排序,要求要能根據分數找到該學生的排名?

千萬別被2000千萬這個數字唬住,理性的看一下題,“高考”這個詞不知道你注意到了沒?這是一個隱藏條件。你高考考了多少分?

總分多少?可能有的小夥伴已經反應過來了。高考700分,那我們開一個700大小的數組,記錄每個分數的的個數就可以了。

對,就是使用桶排序的算法,來進行排。

這一類題他雖然樣子很嚇人,但是仔細 發現他的範圍很小,就抓住他這個範圍小來做文章。

時間複雜度:n  空間複雜度也是700

 

2.給2億個不重複的正整數進行排序(範圍0-2億)?

一個數比一個數誇張,剛纔我們使用的桶排序,現在數的範圍是很大的,所以我們應該想怎麼把他存儲起來,既能節省空間還快,主要是你怎麼來存儲,2億個int類型,一個int4bit,也就是需要8億bit(8億bit大概等於800M,內存恐怕吃不消)。

此時有一個“不重複”這三個字就特別扎眼,我們怎麼利用這個特性呢?

我們居然不能用一個int去裝,那我們就可以用一位去裝,int  = 4bit = 32位。

那麼用的空間就是:2億/32 (大概是25M)這下內存輕輕鬆鬆。

25M大概需要600萬長度的數組。

做法詳情x爲待排序數字。 x/32找到數組下標。x%32找到它對應的位,然後把該位置爲1。

這樣就用奇技淫巧給解決掉了。

 

3.給你一個超大的文件,找出出現頻率最高的5個?

這道題可能就沒那個多的奇技淫巧了。

條件一個一個的增加,先是找出頻率最高的5個,這個沒有多餘的話,肯定是根據頻率最大堆排序。

那麼一個超大文件,也就是說i我們內存沒辦法直接裝下,可以將這個文件先分解(根據實際內存大小和文件大小判斷,下邊以5000份做例子),這時候我們把文件分成了5000份的小文件,然後我們爲每個小文件構造一個數量爲5的最大堆。其餘的數字就可以清掉了。然後5000個小文件就行排序,這時候歸併就要登場了。

我們通過歸併然後對這5千個數據進行歸併拿前5。這就找到了。

 

4.一億個int,short類型的數字進行排序?

這個題是在字節二面的時候遇到的,這個題當時沒有想出什麼好的辦法,然後面試官也沒告訴我。

後來查了資料啥的,然後感覺也沒有特別好的方法。

直接快排。

如果有大佬有更好的見解歡迎賜教!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章