(另一种快速排序的分析方法)对随机化版本的快速排序算法,还有另一种性能分析方法,这一方法关注于每一次单独递归调用的期望运行时间,而不是比较次数。
a. 证明:给定一个大小为nnn的数组,任何特定元素被选为主元的概率为1/n1/n1/n。利用这一点来定义指示器随机变量Xi=IX_i = IXi=I{第iii小的元素被选为主元},E[Xi]E[X_i]E[Xi]是什么?
b. 设T(n)T(n)T(n)是一个表示快速排序在一个大小为nnn的数组上的运行时间的随机变量,试证明:

c. 证明公式(7.5)可以重写为:

d. 证明:

(提示:可以将该累加式分为两个部分,一部分是k=2,3,…,⌈n/2⌉−1k = 2, 3, …, ⌈n/2⌉-1k=2,3,…,⌈n/2⌉−1,另一部分是k=⌈n/2⌉,…,n−1k = ⌈n/2⌉, …, n-1k=⌈n/2⌉,…,n−1。)
e. 利用公式(7.7)中给出的界证明:公式(7.6)中的递归式有解E[T(n)]=Θ(nlgn)E[T(n)] = Θ(n{\rm lg}n)E[T(n)]=Θ(nlgn)。(提示:使用代入法,证明对于某个正常数aaa和足够大的nnn,有E[T(n)]≤anlgnE[T(n)] ≤ an{\rm lg}nE[T(n)]≤anlgn。)
解
a.
数组每个元素都等可能地被选为主元。因此,对于单一元素,它被选为主元的概率为1/n1/n1/n。E[Xi]E[X_i]E[Xi]就等于第iii小的元素被选为主元的概率,即
E[Xi]=PrE[X_i] = PrE[Xi]=Pr{第iii小的元素被选为主元} =1/n= 1/n=1/n。
b.
对于一个大小为nnn的数组,如果选定第qqq小的元素(该元素用zqz_qzq表示)为主元,那么划分得到的222个子数组的大小分别为q−1q-1q−1和n−qn-qn−q。于是可以得到以下递归式

Tq(n)T_q(n)Tq(n)表示在选定第qqq小的元素为主元的前提下,对大小为nnn的数组进行快速排序的运行时间。其实Tq(n)T_q(n)Tq(n)也是一个随机变量,因为T(q−1)T(q-1)T(q−1)和T(n−q)T(n-q)T(n−q)也是随机变量,即[T(q−1)+T(n−q)+Θ(n)][T(q-1) + T(n-q) + Θ(n)][T(q−1)+T(n−q)+Θ(n)]也是随机变量。于是可以写出Tq(n)T_q(n)Tq(n)的期望

qqq的取值范围是1,2,…,n1, 2, …, n1,2,…,n,于是我们可以计算T(n)T(n)T(n)的期望

上式中,E[Xq]∙E(T(q−1)+T(n−q)+Θ(n))=E[Xq(T(q−1)+T(n−q)+Θ(n))]E[X_q ]∙E(T(q-1)+T(n-q)+Θ(n))=E[X_q (T(q-1)+T(n-q)+Θ(n))]E[Xq]∙E(T(q−1)+T(n−q)+Θ(n))=E[Xq(T(q−1)+T(n−q)+Θ(n))]成立,是因为随机变量XqX_qXq和[T(q−1)+T(n−q)+Θ(n)][T(q-1)+T(n-q)+Θ(n)][T(q−1)+T(n−q)+Θ(n)]是互相独立的。
c.
将公式(7.5)的累加求和部分展开,得到下表

由上表可知,第qqq个累加项与第n−q+1n-q+1n−q+1个累加项是完全对称相等的。于是有

上式中,q=0q = 0q=0和q=1q = 1q=1分别对应的T(0)T(0)T(0)和T(1)T(1)T(1)都为常数时间,可以将它们拿掉,这样并不影响最终的结果。于是有

d.
按照提示,将累加式分为2个部分,于是有

e.
只需证明E[T(n)]=O(nlgn)E[T(n)] = O(n{\rm lg}n)E[T(n)]=O(nlgn)即可。
初始情况取n=2n = 2n=2,T(2)T(2)T(2)为常数时间。显然,只要取足够大的aaa,就可使得T(2)≤a•2•lg2=2aT(2) ≤ a•2•{\rm lg}2 = 2aT(2)≤a•2•lg2=2a成立。
下面进行归纳过程。假设E[T(n)]≤anlgnE[T(n)] ≤ an{\rm lg}nE[T(n)]≤anlgn对2,…,n−12, …, n-12,…,n−1都成立,那么有

只要取足够大的aaa,就能使得anlgn−14an+Θ(n)≤anlgnan{\rm lg}n-\frac{1}{4} an+Θ(n)≤an{\rm lg}nanlgn−41an+Θ(n)≤anlgn成立,即E[T(n)]≤anlgnE[T(n)] ≤ an{\rm lg}nE[T(n)]≤anlgn成立。
算法导论 — 思考题7-3 另一种快速排序的分析方法
最新推荐文章于 2025-08-06 19:53:58 发布
本文探讨了随机化快速排序算法的一种分析方法,关注每次递归调用的期望运行时间,并通过数学推导证明了算法的平均时间复杂度为Θ(nlgn)。

2810

被折叠的 条评论
为什么被折叠?



