隨機選擇演算法

2021-08-14 21:06:01 字數 664 閱讀 9058

如何求解無序陣列中第k大的數?

問題:將陣列劃分為兩個子集,元素個數分別為n1,n2,兩個子集各自元素之和分別為s1,s2,使|s2-s1|盡可能大,使|n1-n2|盡可能小。求|s2-s1|。

分析:僅尋找陣列中第n/2大的數,將陣列劃分為兩個集合,乙個子集的元素都小於這個數,另乙個子集的元素都大於這個數,而不在意子集內部的順序,也無需關心這個數是什麼。較為直接的排序的思路則是使兩個子集內部也有序。

#include #include #include using namespace std;

int a[100];

int partition(int a,int left,int right) //按照快速排序的思路進行劃分

a[left] = temp;

return left;

}void randselect(int a,int left,int right,int k) //隨機選擇演算法,從a中找出第k大的元素並放入a[k],從而劃分了子集

int main()

randselect(a,0,n-1,n/2);

for(i = 0;i < n/2;i++)

printf("%d",(sum-sum1)-sum1);

return 0;

}

隨機選擇演算法

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

隨機選擇演算法

討論一種常見的演算法問題,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...