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

2021-06-07 09:04:27 字數 1304 閱讀 1378

問題:從一組數中選出其中最大的k個數,當這組數的個數為幾百、幾百萬、幾百億時分別適合採用哪些演算法?

個數為幾百時,使用順序統計法(看演算法導論第9章):

演算法思想是對輸入陣列進行遞迴劃分,一邊的資料小於選定數,另一邊的資料大於等於選定數。但和快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而順序統計法只處理劃分的一邊。其隨機化演算法的期望時間為o(n)。除了無法處理大規模的資料外,它還有乙個缺點,就是會改變輸入資料的順序,也就是說演算法不是穩定的。

#include #include using namespace std;

#define maxn 103

int a[maxn];

void select(int u, int v, int k)

a[u] = a[j];

a[j] = a;

if (j == k) return;

else if (j < k)

select(j+1, v, k);

else

select(u, j-1, k);

}int main()

return sum;

}void finded(file *in, int v)

cout << endl;

}int main()

while (max > min)

else if (ns < k) max = mid;

else min = mid;

}}

個數為幾萬億時,資料量較大不適合全裝入記憶體中,且無法容忍多次訪問,所有資料只能訪問一次,推薦使用最小堆法(上面那種情況也推薦使用這個方法),但要求k較小,否則無法在記憶體中存下整個最小堆。

用容量為k的最小堆來儲存最大的k個數,最小堆的堆頂元素就是最大k個數中最小的乙個。每次考慮乙個新的元素時,將其與堆頂的元素進行比較,只有當它大於堆頂元素時,才用其替換堆頂元素,並更新最小堆。時間複雜度為o(n*logk)。

#include using namespace std;

#define maxn 103

int h[maxn];

void upshift(int s)

h[s] = tmp;

}void downshift(int n)

h[i] = tmp;

}int main()

for (; i<=n; i++) }

for (i=1; i<=k; i++)

cout << h[i] << " ";

cout << endl;

}

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

問題 有很多個無序的數 假設為n個 怎麼選出其中最大的k個數?kay s word kay的理解 很多 好多好多,無法儲存,因此首先排除了對輸入數排序的解法,而採用小容量陣列整理大的輸入資料,即 開大小為k的陣列,通過遍歷n個輸入陣列,每遍歷乙個數num,檢查k陣列的最小數,如果比num小,則用nu...

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

今天看演算法分析是,看到乙個這樣的問題,就是在一堆資料中查詢到第k個大的值。名稱是 設計一組n個數,確定其中第k個最大值,這是乙個選擇問題,當然,解決這個問題的方法很多,本人在網上搜尋了一番,查詢到以下的方式,決定很好,推薦給大家。所謂 第 前 k大數問題 指的是在長度為n n k 的亂序陣列中s找...

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

在乙個陣列中尋找最大的k個數,我們首先說一種非常簡單的方法,利用快速排序中的分割演算法,即我們經常看見的partition。這個函式會返回乙個 int 型別的值,這個值代表的是前一半數字和後一半數字的分割點,前一半數字都小於等於後一半數字 遞增排序 所以,我們只要找到相對應的分割點,即可以找到最大的...