有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?
如果這個資料量很大,比如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);
有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?
如果這個資料量很大,比如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);