編程之美 尋找最大的K個數

來源:互聯網
上載者:User

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

        如果這個資料量很大,比如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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.