算法_中位数与顺序统计量

中位数与顺序统计量

最大值与最小值

随机算法

  • 目标:寻找中位数

    可以在 O ( n l g n ) O(nlgn) O(nlgn)复杂度内完成(堆排序或快排),所以希望找到线性时间的选择方案

最大值和最小值

  • 寻找最大值或最小值需要 n − 1 n-1 n1次比较

  • 同时寻找最大值或最小值,直观的想法是 2 ( n − 1 ) 2(n-1) 2(n1)次比较。但事实上只需要 3 ⌊ n / 2 ⌋ 3\lfloor n/2 \rfloor 3n/2次比较

    • 对奇数 n n n,令最大值和最小值的初值都为第一个元素,然后成对比较之后的 n − 1 2 \frac{n-1}{2} 2n1个元素
    • 对偶数 n n n,令最大值和最小值为第一对元素的较大值和较小值,然后成对比较之后的 n − 2 2 \frac{n-2}{2} 2n2个元素

选择顺序统计量$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=1nXk(T(max(k1,nk))+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=1nXk(T(max(k1,nk)))+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)] &amp; \leq E[(\sum_{k=1}^n X_k \cdot (T(\max{(k-1,n-k)})) + O(n)] \\ &amp; = \sum_{k=1}^n E[X_k\cdot T(\max{(k-1,n-k)})] + O(n)\\ &amp; = \sum_{k=1}^n E[X_k]\cdot E[T(\max{(k-1,n-k)})] + O(n)\\ &amp; (虽然并不知道为什么独立)\\ &amp; = \sum_{k=1}^n \frac{1}{n} E[T(\max{(k-1,n-k)})] + O(n) \end{aligned} E[T(n)]E[(k=1nXk(T(max(k1,nk)))+O(n)]=k=1nE[XkT(max(k1,nk))]+O(n)=k=1nE[Xk]E[T(max(k1,nk))]+O(n)()=k=1nn1E[T(max(k1,nk))]+O(n)

    考虑 max ⁡ ( k − 1 , n − k ) \max{(k-1,n-k)} max(k1,nk),对偶数, n / 2 n/2 n/2 n − 1 n-1 n1都恰好出现两侧,对奇数,则 ⌊ 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/2n1E[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)] &amp; \leq \frac{2}{n}\sum_{k=\lfloor n/2 \rfloor} ^{n-1} ck + an\\ &amp; = \frac{2c}{n}(\sum_{k=1} ^{n-1} k - \sum_{k=1} ^{\lfloor n/2 \rfloor}k) + an \\ &amp; \leq \frac{2c}{n}(\frac{(n-1)n}{2} - \frac{(n/2-2)(n/2-1)}{2})\\ &amp; = \frac{c}{n}(\frac{3n}{4} + \frac{1}{2} - 2) + an \\ &amp;\leq \frac{3cn}{4} + \frac{c}{2} + an\\ &amp; = cn-(\frac{cn}{4}-\frac{c}{2}-an) \end{aligned} E[T(n)]n2k=n/2n1ck+an=n2c(k=1n1kk=1n/2k)+ann2c(2(n1)n2(n/22)(n/21))=nc(43n+212)+an43cn+2c+an=cn(4cn2can)

    问题转化为寻找满足 c n 4 − c 2 − a n ≥ 0 \frac{cn}{4}-\frac{c}{2}-an\geq 0 4cn2can0 n n n的下界,得到 n ≥ 2 c c − 4 a n\geq \frac{2c}{c-4a} nc4a2c。对于比这个值(设为 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值