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

2022-07-03 17:15:08 字數 2641 閱讀 8523

1:n個元素組成的集合,第

i個順序統計量,就是該集合中第

i小的元素。所以,集合中的最小值就是第1個順序統計量,最大值就是第n個順序統計量。中位數是所屬集合的「中點元素」,當n是奇數的時候,中位數唯一,位於(n+1)/2處。如果n是偶數,中位數有兩個,分別位於n/2和(n/2) + 1。

2:選擇問題,就是選擇第

i個順序統計量的問題。如果利用排序的話,那最快可以在

o(n lgn)

時間內解決,但其實有更快的演算法。

3:為了找到

n個元素中的最小值或者最大值,最少需要

n-1次比較:

minimum(a)

min = a[1]

for i = 2 to a.len

if min > a[i]

min = a[i]

return min

4:對於需要同時找到最大值和最小值的問題,如果是獨立找出最大值和最小值的話,需要

2n-2

次比較,實際上,採用某種方法可以實現比較次數最多到3(

n/2)次。該方法是:記錄已知的最大值和最小值,對輸入的元素成對的進行處理,首先將2個輸入元素相互比較,然後把較小的元素與最小值比較,較大的元素與最大值比較,這樣,每兩個元素共需比較3次。如果n是奇數,把最大值和最小值的初值都設定為第乙個元素的值,所以,比較次數為3((n-1)/2)。如果n是偶數,把前兩個元素作比較,確定最初的最大值和最小值,所以,比較次數為3((n-1)/2)。所以,不管哪一種情況,總的比較次數最多為3(n/2)。

如果要找第二小的元素,證明最壞情況下需要n + lg n – 2次比較。

證明:採用這樣的方法找最小元素:將n個元素成對比較,找到n/2個小元素,然後對著n/2個元素再次成對比較,知道最後乙個元素,也就是最小元素。

在該演算法中,可以從底向上畫出一棵完全二叉樹,數有n個葉子結點,有n-1個內部結點,每個內部結點代表了一次比較,所以在尋找最小元素的過程中,需要n-1次比較。

為了找到第二小的元素,因該元素肯定是在與最小元素的比較過程中被淘汰掉了,所以為了尋找該元素,可以在該完全二叉樹中,找到包含最小元素的分支,該分支一共有

lg n

個結點,在這

lgn個結點中在找最小節點就好了,也是需要

lg n – 1

次比較。

所以一共需要n + lg n – 2次比較。

5:對於一般的選擇問題,可以採用類似於快速排序的方法,可以使執行時間達到θ(n)。該演算法稱為randomized-select演算法。該演算法也是隨機演算法,因為其中呼叫了randomized-partition。演算法偽**如下:

randomized-select(a, p, r, i)

if(p == r)

return a[p]

q = randomized-partition(a, p, r)

k = q – p + 1

if(k == i)

return a[q]

else if i < k

return randomized-select(a,p, q-1, i)

else return randomized-select(a,q+1, r, i-k)

該演算法的最壞情況執行時間為θ( )。但因為是隨機的,所以不存在乙個特定的輸入會導致最壞情況的發生。該演算法的期望執行時間為

o(n)

。int randompartition(int *set, int begin, int end)

}exchange(set+i+1, set+end);

return i+1;

}int partitionselect(int *set, int begin, int end, int index)

if(begin == end)

q = randompartition(set, begin, end);

k = q - begin + 1;

if(index == k)

else if(index < k)

else

}6:select演算法可以在最壞情況執行時間為o(n)來解決選擇問題,該演算法步驟如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

演算法導論學習筆記7 中位數和順序統計量

在乙個n nn個元素的集合中,至少需要做n 1 n 1n 1次比較才能確定其最小元素或最大元素。下面的偽 給出了最樸素的一種方式 minmum a min a 1 for i 2 to a.length if min a i min a i return min當需要同時確定最大最小值時,如果利用上...