中位数与顺序统计量
-
目标:寻找中位数
可以在 O ( n l g n ) O(nlgn) O(nlgn)复杂度内完成(堆排序或快排),所以希望找到线性时间的选择方案
最大值和最小值
-
寻找最大值或最小值需要 n − 1 n-1 n−1次比较
-
同时寻找最大值或最小值,直观的想法是 2 ( n − 1 ) 2(n-1) 2(n−1)次比较。但事实上只需要 3 ⌊ n / 2 ⌋ 3\lfloor n/2 \rfloor 3⌊n/2⌋次比较
- 对奇数 n n n,令最大值和最小值的初值都为第一个元素,然后成对比较之后的 n − 1 2 \frac{n-1}{2} 2n−1个元素
- 对偶数 n n n,令最大值和最小值为第一对元素的较大值和较小值,然后成对比较之后的 n − 2 2 \frac{n-2}{2} 2n−2个元素
选择顺序统计量$X_i$——随机算法
RANDOMIZED_SELECT(A, p, r, i)
//在A[p...r]中寻找第i个顺序统计量
if p == r //递归终点
return A[p]
q = RANDOMIZED_PARTITION(A,p,r)
//将数组A[p...r]随机分成两块,A[q]为主元,并属于低区
k = q - p + 1 //计算低区的长度
if i == k //A[q]是第i个顺序统计量
return A[q]
else if i < k //第i个顺序统计量在低区
return RANDOMIZED_SELECT(A,p,q-1,i)
else return RANDOMIZED_SELECT(A,q+1,r,i-k)
-
RANDOMIZED-SELECT的最坏运行时间 Θ ( n 2 ) \Theta(n^2) Θ(n2)。但不存在特定的最坏的输入序列
以最小元素为例,每次都只排除一个最大的
-
期望运行时间
假设 X k = I { 子 数 组 A [ p . . . q ] 正 好 包 含 k 个 元 素 } X_k=I\{子数组A[p...q]正好包含k个元素\} Xk=I{子数组A[p...q]正好包含k个元素}且元素互异,得到递归式:
T ( n ) ≤ ∑ k = 1 n X k ⋅ ( T ( m a x ( k − 1 , n − k ) ) + O ( n ) ) T(n)\leq \sum_{k=1}^n X_k \cdot (T(max(k-1,n-k)) + O(n)) T(n)≤k=1∑nXk⋅(T(max(k−1,n−k))+O(n))
随机变量的任何一个样本 { x k } n \{x_k\}n {xk}n, ∑ k = 1 n x k = 1 \sum_{k=1}^n x_k = 1 ∑k=1nxk=1,所以
T ( n ) ≤ ( ∑ k = 1 n X k ⋅ ( T ( m a x ( k − 1 , n − k ) ) ) + O ( n ) T(n)\leq (\sum_{k=1}^n X_k \cdot (T(max(k-1,n-k))) + O(n) T(n)≤(k=1∑nXk⋅(T(max(k−1,n−k)))+O(n)
取期望
E [ T ( n ) ] ≤ E [ ( ∑ k = 1 n X k ⋅ ( T ( max ( k − 1 , n − k ) ) ) + O ( n ) ] = ∑ k = 1 n E [ X k ⋅ T ( max ( k − 1 , n − k ) ) ] + O ( n ) = ∑ k = 1 n E [ X k ] ⋅ E [ T ( max ( k − 1 , n − k ) ) ] + O ( n ) ( 虽 然 并 不 知 道 为 什 么 独 立 ) = ∑ k = 1 n 1 n E [ T ( max ( k − 1 , n − k ) ) ] + O ( n ) \begin{aligned} E[T(n)] & \leq E[(\sum_{k=1}^n X_k \cdot (T(\max{(k-1,n-k)})) + O(n)] \\ & = \sum_{k=1}^n E[X_k\cdot T(\max{(k-1,n-k)})] + O(n)\\ & = \sum_{k=1}^n E[X_k]\cdot E[T(\max{(k-1,n-k)})] + O(n)\\ & (虽然并不知道为什么独立)\\ & = \sum_{k=1}^n \frac{1}{n} E[T(\max{(k-1,n-k)})] + O(n) \end{aligned} E[T(n)]≤E[(k=1∑nXk⋅(T(max(k−1,n−k)))+O(n)]=k=1∑nE[Xk⋅T(max(k−1,n−k))]+O(n)=k=1∑nE[Xk]⋅E[T(max(k−1,n−k))]+O(n)(虽然并不知道为什么独立)=k=1∑nn1E[T(max(k−1,n−k))]+O(n)
考虑 max ( k − 1 , n − k ) \max{(k-1,n-k)} max(k−1,n−k),对偶数, n / 2 n/2 n/2… n − 1 n-1 n−1都恰好出现两侧,对奇数,则 ⌊ n / 2 ⌋ \lfloor n/2 \rfloor ⌊n/2⌋出现一次,大于这个值的都出现两侧,所以
E [ T ( n ) ] ≤ 2 n ∑ k = ⌊ n / 2 ⌋ n − 1 E [ T ( k ) ] + O ( n ) E[T(n)] \leq \frac{2}{n}\sum_{k=\lfloor n/2 \rfloor} ^{n-1} E[T(k)] + O(n) E[T(n)]≤n2k=⌊n/2⌋∑n−1E[T(k)]+O(n)
下面用代入法证明,假设 T ( n ) ≤ c n T(n) \leq cn T(n)≤cn
E [ T ( n ) ] ≤ 2 n ∑ k = ⌊ n / 2 ⌋ n − 1 c k + a n = 2 c n ( ∑ k = 1 n − 1 k − ∑ k = 1 ⌊ n / 2 ⌋ k ) + a n ≤ 2 c n ( ( n − 1 ) n 2 − ( n / 2 − 2 ) ( n / 2 − 1 ) 2 ) = c n ( 3 n 4 + 1 2 − 2 ) + a n ≤ 3 c n 4 + c 2 + a n = c n − ( c n 4 − c 2 − a n ) \begin{aligned} E[T(n)] & \leq \frac{2}{n}\sum_{k=\lfloor n/2 \rfloor} ^{n-1} ck + an\\ & = \frac{2c}{n}(\sum_{k=1} ^{n-1} k - \sum_{k=1} ^{\lfloor n/2 \rfloor}k) + an \\ & \leq \frac{2c}{n}(\frac{(n-1)n}{2} - \frac{(n/2-2)(n/2-1)}{2})\\ & = \frac{c}{n}(\frac{3n}{4} + \frac{1}{2} - 2) + an \\ &\leq \frac{3cn}{4} + \frac{c}{2} + an\\ & = cn-(\frac{cn}{4}-\frac{c}{2}-an) \end{aligned} E[T(n)]≤n2k=⌊n/2⌋∑n−1ck+an=n2c(k=1∑n−1k−k=1∑⌊n/2⌋k)+an≤n2c(2(n−1)n−2(n/2−2)(n/2−1))=nc(43n+21−2)+an≤43cn+2c+an=cn−(4cn−2c−an)
问题转化为寻找满足 c n 4 − c 2 − a n ≥ 0 \frac{cn}{4}-\frac{c}{2}-an\geq 0 4cn−2c−an≥0的 n n n的下界,得到 n ≥ 2 c c − 4 a n\geq \frac{2c}{c-4a} n≥c−4a2c。对于比这个值(设为 N 0 N_0 N0)小的,有
E [ T ( n ) ] ≤ 3 c 4 N 0 + c 2 + a N 0 = O ( 1 ) E[T(n)]\leq \frac{3c}{4}N_0 + \frac{c}{2} + aN_0=O(1) E[T(n)]≤43cN0+2c+aN0=O(1)