BFPRT演算法實現 C

2021-10-05 11:06:22 字數 1686 閱讀 3268

利用荷蘭國旗問題的方法求解無序陣列中第k小(或大)的數時間複雜度的期望值是o(n)

bfprt演算法求解無序陣列中第k小(或大)的數時間複雜度是嚴格的o(n)

#include

#include

#include

using

namespace std;

class

bfprt

if(left == right)

// 獲取每組的中位數組成的陣列的中位數(這是bfptr演算法與荷蘭國旗問題最大的不同點)

// 時間複雜度 o(n)

int pivot =

medianofmedians

(arr, left, right)

;// partition過程 《在左,=在中,>在右

// 時間複雜度 o(n)

vector<

int> range =

partition

(arr, left, right, pivot)

;// k恰好在 相等的區域內,直接返回

if(k > range.at(

0)&& k < range.at(

1))// 根據k所在的範圍繼續遞迴

return k <= range.at(

0)?getminkthbybfprt

(arr, k, left, range.at(

0)):

getminkthbybfprt

(arr, k, range.at(

1), right);}

// partition過程 《在左,=在中,>在右,時間複雜度 o(n)

vector<

int>

partition

(vector<

int>

& arr,

int left,

int right,

int pivot)

else

if(arr.

at(index)

> pivot)

else

} vector<

int> res

;return res;

}// 獲取每組的中位數組成的陣列的中位數,時間複雜度 o(n)

intmedianofmedians

(vector<

int>

& arr,

int left,

int right)

return

getminkthbybfprt

(medians, medians.

size()

/2,0

, medians.

size()

-1);

}void

swap

(vector<

int>

& arr,

int n1,

int n2)};

intmain()

; cout <<

bfprt()

.getminkthbybfprt

(arr,6,

0, arr.

size()

-1)<< endl;

system

("pause");

return0;

}

BFPRT演算法詳解

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

bfprt演算法解析

首先講一下bfprt演算法是幹嘛的?bfprt演算法是用來求陣列中第k小的元素的演算法,bfprt演算法可以在o n 時間內求出答案。對於求陣列中第k小的元素的問題,我們已經有很好的常規演算法了,這個演算法在最好的情況下時間複雜度是o n 但在最壞的情況下是o n 2 的,其實bfprt演算法就是在...

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

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