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

2021-06-22 18:36:47 字數 1201 閱讀 9601

這個題目很常見,方法也很多,這裡總結了程式設計之美給出的幾個比較好的方法,也算是對這個問題的乙個總結。

方法一、partition演算法,每次partition的複雜度為o(n),總的平均時間複雜度為o(nlogn)

分析:運用partition演算法,如果返回的provit > k-1,則說明要找的數都在前面,把end= provit-1;如果provit < k-1,表明找到一部分,先把部分資料儲存,然後start = provit + 1;如果正好相等,則儲存後結束,具體**如下:

int partition(vector& numbers,int start,int end)//此partition為了滿足題目的需要,把大的資料移到前面

numbers[start] = provit;

return start;

}vectorsearchthekthnum(vector& numbers,int k)

else//找到全部

}return res;

}

方法二、堆排序

分析:建立乙個大根堆,每次取堆頂元素後,調整堆,迴圈k次後即可,時間複雜度為o(nlogn)

void shiftdown(vector& numbers,int index,int length)//向下調整堆

}vectorsearchthekthnum(vector& numbers,int k)

}vectorsearchthekthnum(vector& numbers,int k)

} return res;

}

方法

四、位位元(適用範圍:資料是沒有重複的整數)

分析:和方法三類似,只是這裡用乙個bit表示乙個資料,優點就是節省空間,缺點就是只能用於沒有重複資料的查詢,例如查詢ip、**號碼等

void getthemaxandminvalue(vector& numbers,int& max,int& min,int length)

}void bit_set(int& data,int index)

vectorsearchthekthnum(vector& numbers,int k)

shift -= 1;

} }return res;

}

以上若有不對的地方,歡迎指正,謝謝

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

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

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

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

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

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