記錄 選擇演算法 BFPRT

2021-08-22 02:24:49 字數 904 閱讀 9059

//陣列大小確定 找第k大 乙個位置確定(分治(快排))的值的的下標正好等於k 這個數為第k大

//因為陣列大小確定 類似二分 當乙個劃分後的數的下標正好等於 k 時 此數為要查詢數

//而因為為劃分後的數 所以可以明顯知道 求的 k 個數是在左邊還是右邊

void nswap(int &a, int &b)

void bubble(int *arr, int l, int r)

int parttion(int *arr, int l, int r, int loc)

//找出中位數 的中位數 對陣列進行劃分 找出第 k 大所在的左右位置 遞迴找出第k大數

int select(int *arr, int l, int r, int n, int k)

//不足5個 排序得到中位數

bubble(arr, i * 5 + l, r);//跳到沒有5個的位置

nswap(arr[l + i], arr[(l + r + 1 + i * 5) / 2]);//交換中位數較小的哪一位arr + l + i * 5 + (size - i * 5) / 2)

//找出中位數的中位數

bubble(arr, l, l + i);

//按位置劃分 並得到準確位置

int loc = parttion(arr, 0, n - 1, l + i / 2);

if (loc == k) return arr[loc];

else if (loc > k) return select(arr, l, loc - 1, n, k);

else if (loc < k)return select(arr, loc + 1, r, n, k);

}int bfprt(int *arr, int n, int k)

}

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 ...