bfprt演算法解析

2021-08-21 18:48:25 字數 2267 閱讀 1170

首先講一下bfprt演算法是幹嘛的?

bfprt演算法是用來求陣列中第k小的元素的演算法,bfprt演算法可以在o(n)時間內求出答案。

對於求陣列中第k小的元素的問題,我們已經有很好的常規演算法了,這個演算法在最好的情況下時間複雜度是o(n),但在最壞的情況下是o(n^2)的,其實bfprt演算法就是在這個基礎上改進的。

我們隨機在陣列中選擇乙個數作為劃分值(number),然後進行快排的partation過程(將小於number的數放到陣列左邊,等於number的數放到陣列中間,大於number的數放到陣列右邊),然後判斷k與等於number區域的相對關係,如果k正好在等於number區域,那麼陣列第k小的數就是number,如果k在等於number區域的左邊,那麼我們遞迴對左邊再進行上述過程,如果k在等於number區域的右邊,那我們遞迴對右邊再進行上述過程。

對於常規解法,我們分析一下它的時間複雜度:

遞迴函式複雜度計算:

t(n)=a*t(n/b)+o(n^d);

當log(b,a)>d時   複雜度為o(n^log(b,a));

當log(b,a)=d時   複雜度為o(n^d*log(2,n));

當log(b,a)對於最好的情況:每次所選的number正好在陣列的正中間,那麼上式中a等於1,b等於2,對於partation過程,時間複雜度是o(n),所以d等於1。所以t(n)= t(n/2)+ o(n),此時 log( 2 , 1 ) < 1,故時間複雜度為o(n)。

對於最壞情況:每次所選的number正好在陣列最邊上,那麼時間複雜度為o(n ^ 2).

bfprt演算法就是在這個number上做文章,bfprt演算法能夠保證每次所選的number在陣列的中間位置,那麼時間複雜度就是o(n)。

bfprt解法和常規解法唯一不同的就是在number的選取上,其他地方一模一樣,所以我們只講選取number這一過程。

第一步:我們將陣列每5個相鄰的數分成一組,後面的數如果不夠5個數也分成一組。

第二步:對於每組數,我們找出這5個數的中位數,將所有組的中位數構成乙個median陣列(中位數陣列)。

第三步:我們再求這個中位數陣列中的中位數,此時所求出的中位數就是那個number。

第四步:通過這個number進行partation過程,下面和常規解法就一樣了。

接下來我們分析一下為什麼bfprt演算法每次選number的時候都能夠在陣列的中間位置。

我們假設這就是分出來的每5個數的小組,每一列代表乙個小組。

圖中紅框內的數我們假設就是每一組的中位數。我們假設總數組的數字個數是n,那麼中位數陣列中數字的個數就是 n / 5 。

我們假設用藍框框起來的數是中位數陣列的中位數(divide),那麼由中位數的性質可知,中位數陣列中有一半的數比這個divide大,所以總共有 n / 10個數比這個divide大。

用紫色框框出的數肯定也是比divide大,所以至少有n / 10 + ( 2*n ) / 10 = ( 3*n ) / 10 個數比divide大,那麼以divide為劃分的partation過程能夠使得divide在陣列的靠近中間的位置,最壞情況也能夠在陣列的 ( 3*n ) / 10 或者 ( 7*n ) / 10 的位置。時間複雜度為o(n)。

#includeusing namespace std;

int a[2];

int bfprt(int root,int begin,int end,int k);//這是核心函式,表示在root陣列的begin位置到end位置上找出第k小的元素

int getmedian(int root,int begini,int endi)//這個函式求的是在root陣列中begini位置到endi位置上的中位數(其實就是求由每5個數所分成的小組的小組內的中位數)

int medianofmedians(int root,int star,int finish)//這個函式是將root陣列star位置到finish位置分成每5個數乙個小組,並求出每個小組內的中位數

int main()

}​

BFPRT演算法詳細解析

bfprt演算法即是選取中位數的中位數的方式,找出陣列n個元素中第k大的數。我們可以根據快速排序得到該值,但是快速排序的平均複雜度為o nlog n 最壞時間複雜度為o n 2 而堆排序也是乙個較好的方法,維護乙個大小為k的堆,時間複雜度為o nlog k 而bfptr演算法。它的最壞時間複雜度為o...

BFPRT演算法詳解

在一大堆數中求其前k大或前k小的問題,簡稱top k問題。而目前解決top k問題最有效的演算法即是bfprt演算法,其又稱為中位數的中位數演算法,該演算法由blum floyd pratt rivest tarjan提出,最壞時間複雜度為o n 在首次接觸top k問題時,我們的第一反應就是可以先...

演算法 BFPRT(線性查詢演算法)

bfprt演算法解決的問題十分經典,即從某n個元素的序列中選出第k大 第k小 的元素,通過巧妙的分 析,bfprt可以保證在最壞情況下仍為線性時間複雜度。該演算法的思想與快速排序思想相似,當然,為使得演算法在最壞情況下,依然能達到o n 的時間複雜 度,五位演算法作者做了精妙的處理。演算法步驟 1 ...