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

2021-06-20 06:04:33 字數 1389 閱讀 4219

一、求最大最小值

即遍歷一次,然後依次跟當前最大或最小的比較一下,遍歷結束,則選擇結束。

(源**來自網上)

//得到最小值

int getmin(int ndata, int nlen)

}return nmin; //返回最小值

}//得到最大值

int getmax(int ndata, int nlen)

}return nmax; //返回nmax

}

二、求第i個順序統計量

就是求集合中第i小的元素

第一種辦法是先排序,然後直接索引。但是

基於比較的排序的執行時間底線是nlogn。而非基於比較的排序又需要各種條件。

第二種分割槽演算法

,每執行一次能夠找出基準值的最終位置,即左邊的值都不大於基準值,右邊的值都不小於基準值,這從而讓人想起了折半查詢,分治思想。

//在區間[low, high)搜尋第k小的元素   

2: int randomizedsearchk(int a, int low, int high, int k)

3:

三、最壞情況為線性時間的選擇演算法

上面期望時間線性是因為可能存在某種最壞的情況,每次分割元的位置都是導致一邊沒有元素,這樣就不能夠達到線性了,而為n 2,接下來的一些預先工作就是避免這種情況發生。

演算法select通過執行下列步驟來確定乙個有n個元素的輸入陣列中的第i個小的元素。

1、將輸入陣列的n個元素劃分為n/5組,每組5個元素,且至多有乙個組由剩下的n mod 5個元素組成。

2、尋找n/5個組中每一組的中位數。(方法首先對每組中的元素進行插入排序,然後從排序過的序列中選出中位數)

3、對第2步中找出的n/5個中位數,遞迴呼叫select找出其中位數x。(如果有偶數個中位數,根據約定,x是下中位數。)

4、利用修改過的partition過程,按中位數的中位數x對輸入陣列進行劃分。讓k比劃分低區的元素多1,所以x是第k小的元素,並且有n-k個元素在劃分的高區。

5、如果i=k,則返回x,否則,如果ik,則在高區找第(i-k)個最小元素。

圖中箭頭指向表示大的數值指向小的數值,所以根據圖可以看出,在x的右邊,每乙個包含5個元素的組中至少有3個元素大於x,x的左邊,每一組中至少有3個元素小於x。(保證x分割一邊必定有元素存在)

圖中顯示的中位數的中位數x的位置,每次選取x作為劃分的好處是能夠保證必定有一部分在x的一邊。

所以演算法最壞情況的遞迴公式可以寫成:

使用替換法可以得出t(n)<=cn。

中位數與順序統計量

在有n個元素的集合中如果想找最小值,最優也就是n 1次,但如果同時找最大值和最小值,最優可以不是2 n 1 次而是3 n 2 次,基本思路是成對的比較,先兩個數之間比較,較小值與最小值比較,較大值與最大值比較,注意奇數偶數要分開討論。include includeusing namespace st...

演算法導論 中位數與順序統計量

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 7 7 一 選擇最大值或者最小值的最優演算法 對於長度為n的陣列,已證找最大值或者最小值比較操作下界就是n 1。所以只需要讓第乙個值為初始最大值或者初始最小值,用所有的值與這個值比較,更新這個值即可。def minimum a minnu...

演算法導論 中位數和順序統計量

在乙個由n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。乙個中位數是它所屬集合的 中點元素 當n為奇數時,中位數是唯一的,位於i n 1 2處 當n為偶數時,存在兩個中位數,分別位於i n 2和i n 2 1處。如果不考慮n的奇偶性,中位數總是出現在i n 1 2 處 下中位數 和i ...