利用荷蘭國旗問題的方法求解無序陣列中第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 ...