線性時間查詢中位數演算法

2021-07-04 11:37:13 字數 1021 閱讀 3918

文章**

一、以期望線性時間做選擇

一般來說,中位數的查詢演算法都是基於先排序,後找中間位置的數字的演算法,但是因為線性時間排序所收到的限制比較大,而如果使用基於比較的排序,時間複雜度將至少為o(nlogn),如何以線性時間完成中位數或者陣列中第n大元素的查詢呢?

快速排序演算法在每一次區域性遞迴後都保證某個元素左側的元素都比他小,右側的元素都比她大,因此,可以利用這個思路快速找到第n大元素,而與快速排序演算法不同的是,我們關注的並不是元素的左右兩邊,而僅僅是某一邊,這樣,可以證明,演算法是線性時間複雜度的

二、程式**

#include 

void exch (int *array, int i, int j)

} double select_middle (int *array, int beg, int end, int n)

exch (array, beg, i);

if (i < n/2)

return select_middle (array, i+1, end, n);

else

if (i > n/2)

return select_middle (array, beg, i-1, n);

else

} } int main ()

printf ("%lf\n", select_middle(array, 0, n-1, n));

return

0;

}

三、改進

在特殊情況下(完全逆序),這個演算法的時間複雜度將不會是線性的,這是什麼他原因造成的呢?這是因為在遞迴過程中,每一次選擇的基準元素都是首個元素,即使使用隨機化的演算法,依然很有可能選擇以非常大或者非常小的元素作為基準

解決方法是,先對整個陣列劃分為若干小組,再對每個小組進行排序,選擇出中位數,再在已經選出的n個中位數中找出他們的中位數,這個最終的中位數就是十分接近中間的數字,以這個數為基準的話,就可以保證在最壞情況下,演算法依然以線性時間執行

BFPRT(中位數的中位數)演算法

又稱為 中位數的中位數演算法 該演算法由 blum floyd pratt rivest tarjan 在1973年提出,最壞時間複雜度為o n 最差的空間複雜度為o logn 演算法步驟 1 將 n 個元素劃分為 n 5 個組,每組 5 個元素,若有剩餘,捨去 2 使用排序方法找到 n 5 個組中...

順序統計量和中位數 線性時間的選擇演算法

一 求最大最小值 即遍歷一次,然後依次跟當前最大或最小的比較一下,遍歷結束,則選擇結束。源 來自網上 得到最小值 int getmin int ndata,int nlen return nmin 返回最小值 得到最大值 int getmax int ndata,int nlen return nm...

O n 時間找到中位數

最直觀的方法是先排序再取中位數,時間複雜度 o n log n 然而最近才得知中位數有時間複雜度 o n 的演算法,事實上任意順序統計量都可以用 o n 時間找出.記待排序的數列 a a 0,dots,a 其子列 a p,dots,r a p,dots,a r 類似快排的方法,找第 i 小的元素.d...