概述
条件期望例题----快排算法的分析
快速排序算法的递归定义如下:
有n个数(
n
≥
2
ngeq 2
n≥2), 一开始随机选取一个数
x
i
x_i
xi, 并将
x
i
x_i
xi和其他n-1个数进行比较, 记
S
i
S_i
Si为比
x
i
x_i
xi小的元素构成的集合,
S
i
ˉ
bar{S_i}
Siˉ为比
x
i
x_i
xi大的元素构成的集合, 然后分别对
S
i
S_i
Si和
S
i
ˉ
bar{S_i}
Siˉ进行排序.
如果集合中元素个数等于2, 则简单比较即可, 如果大于2, 则重复上述过程.
我们选取整个排序过程中的比较次数的期望作为算法效率分析的指标. 记
M
n
M_n
Mn为在n个不同元素的集合中, 实行快速排序算法所需要的比较次数的均值, 易知
M
0
=
M
1
=
0
,
M
2
=
0.5
M_0 = M_1 = 0, M_2 = 0.5
M0=M1=0,M2=0.5.
易知
M
n
=
∑
j
=
1
n
E
[
比较次数
∣
初始随机取的元素为集合中的第
j
个值
]
1
n
M_n = sum_{j=1}^nE[比较次数|初始随机取的元素为集合中的第j个值]frac{1}{n}
Mn=j=1∑nE[比较次数∣初始随机取的元素为集合中的第j个值]n1
如果初始选的值是所有元素中第
j
j
j小的, 则对应的
S
S
S集合就有
j
−
1
j-1
j−1个元素,
S
ˉ
bar{S}
Sˉ就有n-j个元素, 因为第一次选取之后一定会比较
n
−
1
n-1
n−1次, 所以可得
M
n
=
∑
j
=
1
n
(
n
−
1
+
M
j
−
1
+
M
n
−
j
)
1
n
=
n
−
1
+
1
n
∑
k
=
1
n
−
1
M
k
+
1
n
∑
m
=
n
−
1
1
M
m
=
n
−
1
+
2
n
∑
k
=
1
n
−
1
M
k
begin{split} M_n &= sum_{j=1}^n(n-1 + M_{j-1} + M_{n-j})frac{1}{n} \ &=n-1 + frac{1}{n}sum_{k=1}^{n-1}M_k + frac{1}{n}sum_{m=n-1}^{1}M_m \ &=n-1 + frac{2}{n}sum_{k=1}^{n-1}M_k end{split}
Mn=j=1∑n(n−1+Mj−1+Mn−j)n1=n−1+n1k=1∑n−1Mk+n1m=n−1∑1Mm=n−1+n2k=1∑n−1Mk
所以
n
M
n
=
n
(
n
−
1
)
+
2
∑
k
=
1
n
−
1
M
k
nM_n = n(n-1) + 2sum_{k=1}^{n-1}M_k
nMn=n(n−1)+2k=1∑n−1Mk
易知
(
n
+
1
)
M
n
+
1
=
n
(
n
+
1
)
+
2
∑
k
=
1
n
M
k
(n+1)M_{n+1} = n(n+1) + 2sum_{k=1}^{n}M_k
(n+1)Mn+1=n(n+1)+2k=1∑nMk
所以
(
n
+
1
)
M
n
+
1
−
n
M
n
=
n
(
n
−
1
)
=
2
n
+
2
M
n
(n+1)M_{n+1} - nM_n = n(n-1) = 2n+2M_n
(n+1)Mn+1−nMn=n(n−1)=2n+2Mn
即
(
n
+
1
)
M
n
+
1
=
2
n
+
(
n
+
2
)
M
n
(n+1)M_{n+1} = 2n+(n+2)M_n
(n+1)Mn+1=2n+(n+2)Mn
所以
M
n
+
1
=
2
n
n
+
1
+
n
+
2
n
+
1
M
n
M_{n+1} = frac{2n}{n+1} + frac{n+2}{n+1}M_n
Mn+1=n+12n+n+1n+2Mn
两边同除以
(
n
+
2
)
(n+2)
(n+2), 有
M
n
+
1
n
+
2
=
2
n
(
n
+
1
)
(
n
+
2
)
+
M
n
n
+
1
frac{M_{n+1}}{n+2} = frac{2n}{(n+1)(n+2)} + frac{M_n}{n+1}
n+2Mn+1=(n+1)(n+2)2n+n+1Mn
迭代这个过程, 有
M
n
+
1
n
+
2
=
2
n
(
n
+
1
)
(
n
+
2
)
+
(
2
(
n
−
1
)
n
(
n
+
1
)
+
M
n
−
1
n
)
=
⋯
=
2
∑
k
=
0
n
−
1
n
−
k
(
n
+
1
−
k
)
(
n
+
2
−
k
)
(
M
1
=
0
)
begin{split} frac{M_{n+1}}{n+2} &= frac{2n}{(n+1)(n+2)} + left(frac{2(n-1)}{n(n+1)} + frac{M_{n-1}}{n} right) \ &=cdots \ &=2sum_{k=0}^{n-1}frac{n-k}{(n+1-k)(n+2-k)} \ &(M_1 = 0) end{split}
n+2Mn+1=(n+1)(n+2)2n+(n(n+1)2(n−1)+nMn−1)=⋯=2k=0∑n−1(n+1−k)(n+2−k)n−k(M1=0)
所以
M
n
+
1
=
2
(
n
+
2
)
∑
i
=
1
n
i
(
i
+
1
)
(
i
+
2
)
(
i
=
n
−
k
)
=
2
(
n
+
2
)
[
∑
i
=
1
n
2
i
+
2
−
∑
i
=
1
n
1
i
+
1
]
≈
2
(
n
+
2
)
[
∫
3
n
+
2
2
x
d
x
−
∫
2
n
+
1
1
x
d
x
]
(
步长为
1
的数值积分
)
≈
2
(
n
+
2
)
l
n
(
n
+
2
)
begin{split} M_{n+1} &= 2(n+2)sum_{i=1}^{n}frac{i}{(i+1)(i+2)} \ &(i = n-k) \ &=2(n+2)left[sum_{i=1}^{n}frac{2}{i+2} - sum_{i=1}^{n}frac{1}{i+1} right] \ &approx 2(n+2)left[ int_3^{n+2}frac{2}{x}dx - int_2^{n+1}frac{1}{x}dxright] \ &(步长为1的数值积分) \ &approx 2(n+2)ln(n+2) end{split}
Mn+1=2(n+2)i=1∑n(i+1)(i+2)i(i=n−k)=2(n+2)[i=1∑ni+22−i=1∑ni+11]≈2(n+2)[∫3n+2x2dx−∫2n+1x1dx](步长为1的数值积分)≈2(n+2)ln(n+2)
最后
以上就是威武哑铃为你收集整理的条件期望4的全部内容,希望文章能够帮你解决条件期望4所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复