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

2022-04-12 05:22:41 字數 2439 閱讀 1918

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

1、最小值和最大值

在乙個有n個元素的集合中,需要做n-1次(上界)比較才能找到最小值或最大值。

int minivalue(const

int *a, int

len)

}return

minvalue;

}

那麼如何同時找到最小值和最小值呢?

比較簡單的思路是:只要分別獨立找出最大值和最小值,各需要n-1次比較,共需2n-2次比較。下面給出乙個演算法,只需要最多3⌊n/2⌋次比較就可以同時找到最大值和最小值。

思路是:記錄已知的最大值和最小值,對輸出元素成對地進行處理。

(1)首先,將一對輸入元素相互比較,然後將較小的與當前最小值比較,較大的與當前最大值比較,這樣每對元素共需3次比較。

(2)如果n是奇數,將最小值和最大值的初值都設為第乙個元素的值,然後成對地處理餘下的元素;如果n是偶數,就對前兩個元素做一次比較,決定最大值和最小值的初值,然後成對地處理餘下的元素。

1

void minmaxvalue(const

int *a, int len, int &minvalue, int &maxvalue)211

else

1217

18for (; i < len; i += 2)19

25else

2630

31if (tmpmin

3235

36if (maxvalue

3740

}41 }

如果n是奇數,共進行3⌊n/2⌋次比較。如果n是偶數,共進行3(n-2)/2+1=3n/2-2次比較。

2、期望為線性時間的選擇演算法

下面介紹一種解決選擇問題的分治演算法。

#include using

namespace

std;

int randomizedpartition(int *a, int low, int

high)

}a[high] = a[i + 1

]; a[i + 1] =key;

return i + 1;}

int randomizedselect(int *a, int low, int high, int

i)

int q =randomizedpartition(a, low, high);

int k = q - low + 1

;

if (i ==k)

else

if (i

else}//

test

intmain()

;

for (int i = 1; i <= 10; ++i)

cout

<

return0;

}

說明:

(1)randomizedselect的最壞執行時間為

,因為每次劃分時可能總是按餘下的元素中最大的來進行劃分,而劃分操作需要

時間。(2)與快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而randomizedselect只處理劃分的一邊,這一差異體現在效能上就是快速排序的期望執行時間為

,而randomizedselect的期望執行時間為

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

下面介紹乙個最壞情況執行時間為o(n)的選擇演算法select。

步驟1:將輸入陣列的n個元素劃分為⌊n/5⌋組,每組5個元素,且至多只有一組由剩下的n mod 5個元素組成。

步驟2:尋找這⌈n/5⌉組中每一組的中位數:首先對每組元素進行插入排序,然後確定每組有序元素的中位數。

步驟3:對步驟2中找出的⌈n/5⌉個中位數,遞迴呼叫select以找出其中位數x。

步驟4:利用修改過的partition版本,按中位數的中位數x對輸入陣列進行劃分。

步驟5:k為劃分的低區元素個數+1。如果i=k,返回x;如果ik,則在高區遞迴查詢第i-k小的元素。

說明:select演算法通過對輸入陣列的遞迴劃分來找出所需元素,在該演算法中能夠保證得到對陣列的乙個好的劃分。select使用的也是快速排序的確定性劃分演算法partition,做的修改是將劃分的主元也作為輸入引數。

演算法導論之中位數和順序統計量(3)

在乙個由n個元素組成的集合中,第i個順序統計量是該集合中的第i小的元素。本章的演算法正是找出乙個互異的元素集合中的第i小的元素。單個的最小值和最大值 在乙個有n個元素的集合中,我們要確定其中最小的元素,必須要進行n 1次比較,正如minmum a 演算法顯示的這樣 minmun a min a i ...

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

乙個中位數是它所屬集合的中點元素 9.1.1 在乙個有n個元素的集合中,需要做多少次比較才能確定其最小元素呢 9.1.2 同時找到最小值和最大值 實現 同時求解最大值和最小值 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 26 def mini...

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

實際生活中,我們經常會遇到這類問題 在乙個集合,誰是最大的元素?誰是最小的元素?或者誰是第二小的元素?等等。那麼如何在較短的時間內解決這類問題,就是本文要闡述的。先來熟悉幾個概念 1 順序統計量 在乙個由n個元素組成的集合中,第i個順序統計量 order statistic 是該集合中第i小的元素。...