前k大的數

一、前k大的數?

取前 k 個數,並取出最小值(mi(k) = min(k, n)).
遍歷 第 k+1 ~ n的數,與 mi(k) 比較。若小於 mi(k),遍歷下一個。若大於 mi(k),放入該值,並移除mi(k)後,再次取出最小值(mi(k) = min(k, n))。

時間複雜度:O(N * K)。

二、找第k到m(0<k<=m<n)大的數?

1. 將數據分成三個區間:
(1~k-1, k~m, m+1~n),目標是取出適合於k~m區間的數。

2. 操作 前兩個區間,即 1~k-1 和 k~m:
(1) 找出第k-1大的數:從 1~k-1 中,取最大值(方法很多:冒泡,冒一次;直接選擇,一趟選最大)。ma(k-1) = max(k-1, n)。時間複雜度 O(k-1).
(2) 利用快速排序,對 1~m 進行一次快排(不需要整體有序),1~k-2 大的數會被分到 k-1 的左邊,k~m大的數分到 k-1 的右邊。時間複雜度 O(m).
(3) 從 k~m 中,找出最大值和最小值。ma(m) = max(m, m),mi(k) = min(k, m).時間複雜度 O(2(m-k)).

3. 遍歷 m+1~n 的數(nx = n(x)),與 第 k-1 大的數進行比較.
小於 k-1的數,即nx < ma(k-1),放入左邊;右邊收錄n(k-1),(比較n(k-1)與ma(m),大的數被淘汰出去。受影響的區域,最值從新獲取。時間複雜度 O((n-(m+1))*(k-1)).


時間複雜度(比較複雜):O((n-(m+1))*(k-1)) = (K-1) + m + 2(m-k) + (n-(m+1))*(k-1).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章