您的位置:首页 > 其它

算法导论——lec 09 中位数和顺序统计学

2014-07-06 20:36 260 查看
一、 最大值和最小值问题

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)的约束,因为它们没有使用排序就解决了选择的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息