随机版的快速排序分析方法

来源:互联网 发布:住建部bim数据库 编辑:程序博客网 时间:2024/06/11 07:25

随机版的快速排序(Randomized Quicksort)。

  • 运行时间不依赖于输入的排序情况
  • 最坏情况仅由随机数的生成决定

      通常的做法是随机地选择主元(pivot)。

T(n)为渐近运行时间,其期望值(Expectation)为E[T(n)],我们希望对所有的输入,找出这个期望值。

对k=0,1,2,...,n-1,我们定义一个0-1随机变量X_k:

X_k = 1  // 如果PARTITION分割成k:n-k-1

          0  // 如果不是的话

X_k的期望E[X_k] = 1*Pr{X_k = 1} + 0*Pr{X_k=0} = Pr{X_k=1} = 1/n。而T(n)可以写成:


 

这个递归式有n种情况,我们可以借助0-1变量来处理:

当确定了其中的一个划分方式k:n-k-1时,有X_k=1, X_1,X_2,,,,,,X_k-1,X_k+1,,,,,这些全为0.即下面的式子可以表示上面的n条式子



这样E[T(n)]可以写成:

因为E[T(0)]=Theta(1),E[T(1)]=Theta(1),(T(n)为渐近运行时间,当只有0个或者1个数字时,可以在theta(1)时间内完成排序)为了计算方便,将最后一个和式中的k=0,k=1吸收到Theta(n)中去(只是将后一项的常系数变大一些):



剩下的就是使用替换法证明E[T(n)] <= anlgn,a>0。这里先证明基本情况,当a取足够大的值,而k取足够小的值,则可以实现下面的式子成立。即

E[T(k)] <= aklgk在a,k取合适值时成立(已知条件,意即假设这个条件是成立的,然后去证明这个条件确实成立,则结论是正确的,抽象,但是,是对的。举个简单的例子,不妨猜测E[T(k)] <= aklgk成立,原先我们不知道它是不是成立,但是不妨先假设它成立,然后,将它代入式子的右端,通过推导,如果推出的结果是左端E[T(n)] <= anlgn成立,则说明我们一开始的猜测是正确的)(1)

这里可以看出我们将k=0,1吸收到Theta(n)中的好处,因为lg0无法处理,lg1=0。我们还需要用到一个事实,它的证明见点击打开链接



 

将E[T(k)]代入E[T(n)]可得:用(1)式代入E[T(k)]