T(n)=2T(n/2)+n=o(nlogn)

T(n)=2T(n/2)+n

设n=2^k
T(n/2)=2T(n/2^2)+n/2
T(n/2^2)=2T(n/2^3)+n/2^2
T(n)=2T(n/2)+n=2^2T(n/2^2)+2*n/2+n=2^3T(n/2^3)+2^2*n/2^2+2*n/2+n
    =2^kT(1)+kn=nT(1)+kn=n(logn+T(1))=o(nlogn)
    注:T(1)=0

快速排序的最优时间复杂度是 O(nlogn)O(nlogn),最差时间复杂度是 O(n2)O(n2),期望时间复杂度是 O(nlogn)O(nlogn)。

这里我们证明一下快排的期望时间复杂度。

设 T(n)T(n) 为对长度为 nn 的序列进行快速排序所需要的期望时间。我们有:


 <script type="text/javascript" src="http://common.cnblogs.com/script/ASCIIMathML.js"></script>

 
T(0)=0T(0)=0

以及:

T(n)=n+1ni=0n1(T(i)+T(ni1))T(n)=n+1n∑i=0n−1(T(i)+T(n−i−1))

我们可以通过放缩来获得对 T(n)T(n) 上界的一个估计。

T(n)=n+1ni=0n1(T(i)+T(ni1))T(n)=n+1n∑i=0n−1(T(i)+T(n−i−1))
=n+2ni=2nn1(T(i)+T(ni1))=n+2n∑i=2nn−1(T(i)+T(n−i−1))
=n+2ni=2n3n4(T(i)+T(ni1))+2ni=3n4n1(T(i)+T(ni1))=n+2n∑i=2n3n4(T(i)+T(n−i−1))+2n∑i=3n4n−1(T(i)+T(n−i−1))

因为 T(n)>=nT(n)>=n , 所以对于 n2<=i<=jn2<=i<=j,我们显然有:

T(i)+T(ni)<=T(j)+T(nj)T(i)+T(n−i)<=T(j)+T(n−j)

所以:

T(n)<=n+2ni=2n3n4(T(3n4)+T(n4))+2ni=3n4n1(T(n1)+T(0))T(n)<=n+2n∑i=2n3n4(T(3n4)+T(n4))+2n∑i=3n4n−1(T(n−1)+T(0))
<=n+12(T(3n4)+T(n4))+12T(n1)<=n+12(T(3n4)+T(n4))+12T(n−1)

我们要证明 T(n)=O(nlogn)T(n)=O(nlogn) , 这需要证明存在常数 cc 满足 T(n)<=cnlognT(n)<=cnlogn。

我们考虑用数学归纳法证明。n=0n=0时定理显然成立。现在假设对于 m<=nm<=n 定理皆成立。那么:

T(n)<=n+12(T(3n4)+T(n4))+12T(n1)T(n)<=n+12(T(3n4)+T(n4))+12T(n−1)
<=n+12(c(3n4)log(3n4)+c(n4)log(n4))+12c(n1)log(n1)<=n+12(c(3n4)log(3n4)+c(n4)log(n4))+12c(n−1)log(n−1)
<=n+c(3n8log(n)3n8log(43)+n8log(n)n8log(4)+n2log(n))<=n+c(3n8log(n)−3n8log(43)+n8log(n)−n8log(4)+n2log(n))
=cnlogn+n(13c8log(43)c4)=cnlogn+n(1−3c8log(43)−c4)

当 13c8log(43)c4<=01−3c8log(43)−c4<=0 时,也即约 c>=52c>=52,我们有:

T(n)<=cnlognT(n)<=cnlogn

.

归纳成立,T(n)=O(nlogn)T(n)=O(nlogn).

猜你喜欢

转载自www.cnblogs.com/xfcao/p/12551686.html