程式設計之美 尋找最大的K個數

2021-06-15 09:27:36 字數 1479 閱讀 1983

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?

如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?

分兩部分,第一部分是我個人的解答,第二部分是書上的解答;

第一部分:

1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣列,把原陣列裡的資料map到新開闢的陣列裡,如:原陣列裡有資料123,則在新開闢陣列的123位置上填入1,。然後對新開闢的陣列從後往前掃瞄,記錄值為1的陣列的下標。整個過程的時間複雜度o(n+k),n是原陣列的大小,k是陣列裡最大資料的大小;空複雜度為o(k)。這種解法對空間的要求大,時間上是線性的,可以接受。

,2, 考慮到不能開闢新的空間的話,可以利用快速排序,時間複雜度n(lgn),然後取出前k個,總的複雜度為o(nlgn+k);利用優先佇列,複雜度:o(nlgn);

,3,如果資料是浮點數,我們可以採用類似桶排序的思想,新開闢乙個空間

圖 a書上的答案:

1,對於小資料量,快速排序或是堆排序,f複雜度o(nlgn)+o(k);選擇排序,複雜度o(n*k);

2,利用快速排序的思想,把大問題化成小問題,引用原書上上的話:

總結:我們對於排序類的問題,無非三種思路,要麼利用現有排序(或是對其進行改進),要麼用空間換時間,要麼大問題化小問題,這裡結合了第一種情況和第二種情況;

3,如果資料量很大呢,比如100億,推薦使用小頂堆;時間複雜度o(nlgn);

4, 利用線性排序的思想,空間換時間;

擴充套件:懶得打字,我全拍下來,然後乙個個分析吧。

題1:很明顯,直接上桶排序,如圖a;

題2:用空間換時間最快了,直接掃苗;也可以利用堆排序,直接獲取k到m之間的數,還可以選擇排序;複雜度都是o((m-k)lgn);

題3:維護乙個堆最好了(小頂堆);

題4和題5  看不懂。

此題還可以擴充套件成為:求乙個陣列裡第k大的數。

思路:1  排序吧,快排/堆排,複雜度o(nlgn)+o(k);

2,空間換時間,複雜度o(n)+o(len);

3,選擇排序,時間複雜度o(kn);

4 ,以上演算法在控制空間的情況下,複雜度始終沒有突破o(n),如果採用分治,類似快排的思想,第一趟資料分割後,比較中間資料左右的個數與k的大小,複雜度為o(n);

第二趟繼續,複雜度為o(n/2),一直到複雜度為o(n/2^k)。總的複雜度o(2n);

程式設計之美 尋找最大的K個數

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...

程式設計之美 尋找最大的k個數

有很多無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個數呢?idea 1 先用快速排序或者堆排序進行排序,然後取出最大的k個數,時間複雜度為o nlogn o k o nlogn idea 2 進行k趟最大冒泡或者k次大頂堆的輸出,時間複雜度為o n k 根據k與logn的大小比較,選取...

《程式設計之美》 尋找最大的K個數

題目 n個無序的數 可能數目非常大 選出其中最大的k個數。分析與解法 解法一 對n個數進行排序,然後選出最大的k個數。可以使用快速排序或堆排序,時間複雜度為o nlogn 因為這裡n的數目可能非常大,即n k,而前n k個數可以不進行排序,使用可以部分排序的演算法,如選擇排序或交換排序,時間複雜度為...