算法导论——lec 09 中位数和顺序统计学
2014-07-06 20:36
260 查看
一、 最大值和最小值问题
1、 找到最大值和最小值的程序
2、 同时找出最大值和最小值:可以按照上面的程序,多一次比较,总共比较2n-2次。这是渐近最优的(n)。
3、 事实上至多进行3*floor(n/2)次比较就可以确定最大值和最小值:将一对元素进行比较,将其中较大的与最大值作比较,较小的与最小值作比较。
二、 以期望线性时间做选择
1、 一般选择问题:找出数组中第i大的元素。看起来比找最小值要复杂,但实际上两种问题的渐进运行时间相同,都是Θ(n)。
2、 Randomized-Select算法:
a、 采用分治法,以quick-sort为模型;
b、 区别在于只处理划分的一边;
c、 期望时间为Θ(n)。
b、 算法的平均情况性能较好:Θ(n);
c、 因为它是随机化的,所以没有哪种特别输入能导致最坏情况的发生。
假设程序RANDOMIZED-SELECT以相等的可能性返回任何元素作为主元,定义指示器随机变量Xk 为
Xk = I { 子数组A[p...q] 中恰有k个元素 }
E(Xk) = 1/n
RANDOMIZED-SELECT在划分之后递归调用,为考虑上界,假定第i个元素总是在划分的较大一边;对于一个给定的RANDOMIZED- SELECT,指示器变量Xk 刚好在一个k值上取1,在其他的k值是都是0。
当Xk =1时,可能要递归处理的两个子数组的大小分别为k-1和n-k,因此可以得到递归式
取期望值得到:(期望计算中用到了Xk 和T(max(k-1, n-k))是独立随机变量的假设)
考虑表达式max(k-1,n-k),我们有
当n为偶数的时候:从T(ceil(n/2))到T(n-1)的每个项在综合中都会出现两次;
当n为奇数的时候:所有这些项会出现两次,而T(ceil(n/2))只出现一次。
因此:
用替换法证明有E[(T(n)]≤cn
此时可以选择常数c使得c/4 - a > 0,同时
即,如果假设对n<2c/(c-4a),有T(n)=O(1),就有E[T(n)]=O(n)
结论:平均情况下任何顺序统计量(尤其是中位数)都可以在线性时间内得到。
三、 最坏限行时间的选择
1、 Select算法:基本思想是保证对数组的划分是个好的划分,采用确定性划分算法,并作修改,把划分主元元素作为其参数。
2、 Select算法过程:
a、 将输入数组的n个元素划分为⌈n/5⌉组,每组5个元素,且至多只有一个组由剩下的n mod 5个元素组成;
b、 寻找⌈n/5⌉个组中每一组的中位数,首先对每组中的元素(至多为5个)进行插入排序, 然后从排序过的序列中选出中位数;
c、 对第2步中找出的⌈n/5⌉个中位数,递归调用SELECT以找出其中位数x,(若为偶数约定为下中位数)。
d、 利用修改过的PARTITION过程,按中位数的中位数x对输入数组进行划分。让k比划分低区的元素数目多1,所以x是第k小的元素, 并且有n-k个元素在划分的高区。
e、 如果i=k,则返回x;
否则,如果i<k,在低区递归调用SELECT以找出第i小的元素;
如果i>k,在高区递归调用Select以找出第i-k小的元素。
分析:先来确定大于划分元素x的元素数的下界,大于x的元素个数至少有
同样,小于x的元素也至少有3n/10 - 6;
因此,最坏情况下,第5步最多有7n/10+6个元素递归调用SELECT
最坏情况下:
a、 步骤1、2、4需要O(n)的时间;
b、 步骤3花时间T(⌈n/5⌉);
c、 步骤5所需时间至多为T(7n/10+ 6);
d、 假设T是单调递增的;
e、 假设任何等于或小于140个元素的输入需要O(1)的时间
我们得到递归式:
使用替换法,假设对某个适当大的从常数c和所有的n ≤ 140,有T(n) ≤cn;
挑选一个常数a,使得对所有n>0,由上述O(n)项所描述的函数由an从上方限界
可以发现,如果-cn/10 + 7c + an ≤0, 即可证明T(n)≤cn;当n > 70时,c ≥10a(n/(n - 70))
所以当n ≥140时,有n/(n - 70) ≤2,此时选择c ≥20a即可得出结论
因此,SELECT最坏情况下也是线性的。
3、 说明:
a、 与比较排序中一样,SELECT和RANDOMIZED-SELECT仅通过元素间的比较来确定它们之间的相对次序;
b、 比较模型中,即使在平均情况下,排序算法仍然需要Ω(n lg n)的时间;
c、 而线性时间排序算法在输入上做了假设;
d、 线性时间选择算法不对输入做任何假设, 不受Ω(n lg n)的约束,因为它们没有使用排序就解决了选择的问题。
1、 找到最大值和最小值的程序
Minimum(A) 1 min<--A[1] 2 for i<--2 to length[A] 3 do if A[i] < min 4 then min <-- A[i] 5 return min将以上的比较看做一次锦标赛,除了最终获胜者以外,每个元素至少输掉了一场比赛,因此,为了确定最小(大)值,至少要进行n-1次比较。
2、 同时找出最大值和最小值:可以按照上面的程序,多一次比较,总共比较2n-2次。这是渐近最优的(n)。
3、 事实上至多进行3*floor(n/2)次比较就可以确定最大值和最小值:将一对元素进行比较,将其中较大的与最大值作比较,较小的与最小值作比较。
二、 以期望线性时间做选择
1、 一般选择问题:找出数组中第i大的元素。看起来比找最小值要复杂,但实际上两种问题的渐进运行时间相同,都是Θ(n)。
2、 Randomized-Select算法:
a、 采用分治法,以quick-sort为模型;
b、 区别在于只处理划分的一边;
c、 期望时间为Θ(n)。
Randomized-Select(A, p, r, i) 1 if p = r 2 then return A[p] 3 q = randomized-partition(A, p, r) 4 k <-- q - p + 1 5 if i = k 6 then return A[k] 7 else if i < k 8 then return Randomized-Select(A, p, q-1, i) 9 else 10 return Randomized-Select(A, q+1, r, i-k)算法分析:a、 Randomized-Select算法的最坏情况运行时间为Θ(n^2);即使是用它来寻找最大值和最小值最坏情况运行时间也是Θ(n^2)。
b、 算法的平均情况性能较好:Θ(n);
c、 因为它是随机化的,所以没有哪种特别输入能导致最坏情况的发生。
假设程序RANDOMIZED-SELECT以相等的可能性返回任何元素作为主元,定义指示器随机变量Xk 为
Xk = I { 子数组A[p...q] 中恰有k个元素 }
E(Xk) = 1/n
RANDOMIZED-SELECT在划分之后递归调用,为考虑上界,假定第i个元素总是在划分的较大一边;对于一个给定的RANDOMIZED- SELECT,指示器变量Xk 刚好在一个k值上取1,在其他的k值是都是0。
当Xk =1时,可能要递归处理的两个子数组的大小分别为k-1和n-k,因此可以得到递归式
取期望值得到:(期望计算中用到了Xk 和T(max(k-1, n-k))是独立随机变量的假设)
考虑表达式max(k-1,n-k),我们有
当n为偶数的时候:从T(ceil(n/2))到T(n-1)的每个项在综合中都会出现两次;
当n为奇数的时候:所有这些项会出现两次,而T(ceil(n/2))只出现一次。
因此:
用替换法证明有E[(T(n)]≤cn
此时可以选择常数c使得c/4 - a > 0,同时
即,如果假设对n<2c/(c-4a),有T(n)=O(1),就有E[T(n)]=O(n)
结论:平均情况下任何顺序统计量(尤其是中位数)都可以在线性时间内得到。
三、 最坏限行时间的选择
1、 Select算法:基本思想是保证对数组的划分是个好的划分,采用确定性划分算法,并作修改,把划分主元元素作为其参数。
2、 Select算法过程:
a、 将输入数组的n个元素划分为⌈n/5⌉组,每组5个元素,且至多只有一个组由剩下的n mod 5个元素组成;
b、 寻找⌈n/5⌉个组中每一组的中位数,首先对每组中的元素(至多为5个)进行插入排序, 然后从排序过的序列中选出中位数;
c、 对第2步中找出的⌈n/5⌉个中位数,递归调用SELECT以找出其中位数x,(若为偶数约定为下中位数)。
d、 利用修改过的PARTITION过程,按中位数的中位数x对输入数组进行划分。让k比划分低区的元素数目多1,所以x是第k小的元素, 并且有n-k个元素在划分的高区。
e、 如果i=k,则返回x;
否则,如果i<k,在低区递归调用SELECT以找出第i小的元素;
如果i>k,在高区递归调用Select以找出第i-k小的元素。
分析:先来确定大于划分元素x的元素数的下界,大于x的元素个数至少有
同样,小于x的元素也至少有3n/10 - 6;
因此,最坏情况下,第5步最多有7n/10+6个元素递归调用SELECT
最坏情况下:
a、 步骤1、2、4需要O(n)的时间;
b、 步骤3花时间T(⌈n/5⌉);
c、 步骤5所需时间至多为T(7n/10+ 6);
d、 假设T是单调递增的;
e、 假设任何等于或小于140个元素的输入需要O(1)的时间
我们得到递归式:
使用替换法,假设对某个适当大的从常数c和所有的n ≤ 140,有T(n) ≤cn;
挑选一个常数a,使得对所有n>0,由上述O(n)项所描述的函数由an从上方限界
可以发现,如果-cn/10 + 7c + an ≤0, 即可证明T(n)≤cn;当n > 70时,c ≥10a(n/(n - 70))
所以当n ≥140时,有n/(n - 70) ≤2,此时选择c ≥20a即可得出结论
因此,SELECT最坏情况下也是线性的。
3、 说明:
a、 与比较排序中一样,SELECT和RANDOMIZED-SELECT仅通过元素间的比较来确定它们之间的相对次序;
b、 比较模型中,即使在平均情况下,排序算法仍然需要Ω(n lg n)的时间;
c、 而线性时间排序算法在输入上做了假设;
d、 线性时间选择算法不对输入做任何假设, 不受Ω(n lg n)的约束,因为它们没有使用排序就解决了选择的问题。
相关文章推荐
- 《算法导论的Java实现》 10 中位数和顺序统计学
- 算法导论 第9章 中位数和顺序统计学(线性时间选择算法)
- 算法导论第九章:中位数和顺序统计学
- 《算法导论》读书笔记之第9章 中位数和顺序统计学
- 《算法导论》读书笔记之第9章 中位数和顺序统计学
- 算法导论代码 第9章 中位数和顺序统计学
- 算法导论学习笔记——第9章 中位数和顺序统计学
- 《算法导论》学习总结 — 9.第九章 中位数和顺序统计学
- 算法导论(第9章-中位数和顺序统计学)最大值和最小值
- 算法导论第九章中位数和顺序统计学例题
- 《算法导论》— Chapter 9 中位数和顺序统计学
- 算法导论 第9章 中位数和顺序统计学(线性时间选择算法)
- 《算法导论》— Chapter 9 中位数和顺序统计学
- 《算法导论》学习总结——第二部分6中位数和顺序统计学
- 算法导论-------------中位数和顺序统计学
- 《算法导论》学习总结 — 9.第九章 中位数和顺序统计学
- 《算法导论》第九章----中位数和顺序统计学
- 《算法导论》读书笔记之第9章 中位数和顺序统计学
- 《算法导论》10、中位数和顺序统计学(C++)
- 《算法导论》读书笔记之第9章 中位数和顺序统计学 最坏情况是线性时间的选择算法