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

2021-07-07 02:06:58 字數 824 閱讀 1842

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

idea 1:

先用快速排序或者堆排序進行排序,然後取出最大的k個數,時間複雜度為o(nlogn)+o(k)=o(nlogn)

idea 2:

進行k趟最大冒泡或者k次大頂堆的輸出,時間複雜度為o(n*k)

根據k與logn的大小比較,選取時間複雜度低的演算法

方法三:時間複雜度為o(n*log( |vmax - vmin|  / delta)),資料分布均勻時,時間複雜度為o(nlogn)

尋找n個數中最大的k個數,重點在於宣召最大的k個數中最小的那個,也就是第k大的數。

用容量為k的小頂堆來儲存最大k個數,從數列中取乙個數x與當前的堆頂元素y比較,若x>y,則交換,然後調整堆,否則取下乙個數進行判斷,以此判斷直到所有的數都判斷完畢。調整堆的時間複雜度為o(logk)

調整更新的偽**為:

所有整數都在(0, max)區間的話,用陣列count[max]儲存每個數的出現次數。只需掃瞄一遍即可得到count陣列,然後尋找最大的k個數。

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

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

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

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

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

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