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

2021-09-16 13:28:23 字數 3056 閱讀 6799

在乙個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

當需要同時確定最大最小值時,如果利用上述方法對每個元素進行兩次比較,則所需比較次數為2(n

−1

)2(n-1)

2(n−1)

。一種最多需要3⌊n

/2

⌋3\lfloor n/2\rfloor

3⌊n/2⌋

次比較就同時確定最大最小值的方法:首先將輸入中的一對元素進行比較,然後將較小值與當前的最小值進行比較,將最大值與當前的最大值進行比較。這樣,每兩個元素僅需要進行三次比較。(具體c++實現在文末的附錄中。)

上面看到,我們可以很容易在θ(n

)\theta(n)

θ(n)

時間確定序列中的最大元素或者最小元素;

當我們需要確定序列中的某個順序量,例如確定序列中第i

ii小的數時,看似比上面的問題複雜許多,但實際上兩者的漸近執行時間時相同的:θ(n

)\theta(n)

θ(n)

。下面給出基於分治策略的求解方法,該方法和快速排序的方法幾乎一致,但與快速排序不同的是該演算法只需要處理劃分之後的一邊,因此且遞迴樹比快速排序小許多,執行時間在期望情況下為θ(n

)\theta(n)

θ(n)

quick_select

(a, p, r, i)

if p == r

return a[p]

q =randomized_partition

(a, p, r)

k = q - p +

1if i == k

return a[q]

else

if i < k

quick_select

(a, p, q -

1, i)

else

quick_select

(a, q +

1, r, i - k)

:k

kk為小於劃分點q

qq的元素個數。如果k=i

k=ik=

i,則a[q]就是要查詢的元素;如果k

>

ik>i

k>

i,則要查詢的元素在a[q

]a[q]

a[q]

的左側,否則在右側。如果要查詢的元素在a[q

]a[q]

a[q]

的右側,則遞迴呼叫quick_select時,要查詢的元素應為第i−k

i-ki−

k個。

#include

#include

using

namespace std;

struct minmax

;minmax minmax

(vector<

int>

& data);if

(data.

size()

==0)return minmax;

else

if(data.

size()

==1)else

else

for(

; i < data.

size()

; i +=2

)else

if(mintemp < minmax.min) minmax.min = mintemp;

if(maxtemp > minmax.max) minmax.max = maxtemp;

}return minmax;}}

intmain

(int argc,

char

* ar**)

; minmax ret =

minmax

(data)

; cout << ret.min <<

" "<< ret.max << endl;

return1;

}

#include

#include

#include

using

namespace std;

class

quick_select

;void quick_select::

exchange

(vector<

int>

& data,

int a,

int b)

int quick_select::

randomized_partition

(vector<

int>

&data,

int p,

int r)

}exchange

(data, i +

1, r)

;return i +1;

}int quick_select::

select

(vector<

int>

& data,

int p,

int r,

int i)

else

select

(data, q +

1, r, i - k);}

intmain

(int argc,

char

* ar**)

; quick_select a;

int ret = a.

select

(data,0,

9,5)

; cout << ret << endl;

return1;

}

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

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

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

1 n個元素組成的集合,第 i個順序統計量,就是該集合中第 i小的元素。所以,集合中的最小值就是第1個順序統計量,最大值就是第n個順序統計量。中位數是所屬集合的 中點元素 當n是奇數的時候,中位數唯一,位於 n 1 2處。如果n是偶數,中位數有兩個,分別位於n 2和 n 2 1。2 選擇問題,就是選...

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

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