隨機選擇演算法

2021-08-07 13:20:52 字數 782 閱讀 6591

問題描述:

本文主要討論這樣乙個問題:如何從乙個無序的陣列中求出第k大的數。

這個問題最直接的想法是對陣列排一下序,然後直接取出第k個元素即可,這樣做法需要o(nlogn)的時間複雜度。(這個方法比較簡單,在執行時間允許的情況下當然選這個方法)下面介紹隨機選擇演算法,它對任何輸入都可以達到o(n)的期望時間複雜度。

基本思想:

隨機選擇演算法的原理類似於隨機快速排序演算法。當對a[left,right]執行一次randpartition函式之後,主元左側的元素個數就是確定的,且它們都小於主元。假設此時主元是a[p],那麼a[p]就是a[left,right]中的第乙個p-left+1大的數。不妨令m表示p-left+1,那麼如果k==m成立,說明第k大的數就是主元a[p];如果k

void randselect(int n, int left, int right,int k)

n[left] = temp; //把temp放在left和right相遇的地方

return left; //返回相遇下標

}//隨機選擇演算法,從n[left,right]中找到第k大的數,並進行劃分

void randselect(int n, int left, int right,int k){

if (left == right) return;

int p = randpartition(n, left, right);

int m = p - left + 1;

if (k == m) return;

if (k

隨機選擇演算法

如何求解無序陣列中第k大的數?問題 將陣列劃分為兩個子集,元素個數分別為n1,n2,兩個子集各自元素之和分別為s1,s2,使 s2 s1 盡可能大,使 n1 n2 盡可能小。求 s2 s1 分析 僅尋找陣列中第n 2大的數,將陣列劃分為兩個集合,乙個子集的元素都小於這個數,另乙個子集的元素都大於這個...

隨機選擇演算法

討論一種常見的演算法問題,topk問題,即從乙個無序陣列中求出第k大的數,比如陣列,第三大的數是5,第五大的數是9。首先最簡單的方法是先排序,然後直接取出第k大元素,但是樣最好的時間複雜度也得到o nlogn 隨機選擇演算法可以到o n 的複雜度。原理有點類似於快速排序演算法,首先看一下快排中的ra...

隨機選擇演算法

問題描述 從乙個無序序列找乙個k大的數 最直接的想法是先排序再找,但這樣需要o nlogn 的時間複雜度 隨機選擇演算法雖然最壞的時間複雜度為o n 2 但對於任何輸入都可以達到o n 的時間複雜度 思想描述 選擇乙個主元,經過一次快排後主元為a p 在a left,right 中該主元為第p le...