MIT算法导论——第六讲.Order statistics and Median

来源:互联网 发布:java随机数生成1到10 编辑:程序博客网 时间:2024/05/22 08:08

本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记。所有内容均来自MIT公开课Introduction to Algorithms中Charles E. Leiserson和Erik Demaine老师的讲解。(http://v.163.com/special/opencourse/algorithms.html)

第六节-------顺序统计、中值 Order statistics

这节课主要谈顺序统计问题的两个算法,都是线性时间,第一个算法是随机的,所以只是期望上的线性时间;第二个算法考虑最坏情况并以第一个算法为基础。问题是这样:给定n个无序的数,找到第k小的数。换句话说,我有一组无序的数,假如我能够把这些数排序,我就能知道第k号元素是什么。这也是这个问题最原始的解决方案(Naive algorithm),算法复杂度最好的当然是Θ(nlgn)。但是我们希望能够有更好的解决方案,最好是线性时间。

这个问题是很自然的,这个问题也有许多的应用,具体是取决于你对k的选择。当i = 1和i = n时分别是求序列的最小值、最大值,计算这两个值非常没意思,只要遍历数组并记录下最小值和最大值即可,算法复杂度当然是O(n)。更有意思的版本是下图中的第三种情况,即找出中位数。


一、随机选择算法

随机选择算法是一种随机的分治算法,伪代码如下图所示。


上述的算法很容易理解,困难的是分析它的算法复杂度。这里的分析和随机化快速排序类似,今天分析的前提依然是假设这里所有的数都是不相等的。如果有相等的元素,就得修改一下算法。跟随机化快排一样,分Lucky和unlucky两种情况来分析,如下图所示。


由上图可以看到,最坏情况下,这个算法效率巨差。但是大多数时候,它都很好是我们所期望的线性时间。除非你确实背到家了,每次掷硬币都输,不然不会如此。至少我们接下来要证明它。接下来的证明过程和随机化快排类似,需要用到指示随机变量Xk。具体定义请参考第四讲。计算期望时间的第一步当然是看看有哪些不同的情况。我们有很多种划分可能,可能是分为0和n - 1,也可能是对半分,一共有n种划分可能。那么根据不同情况分贝分析算法的运行时间。


所以,下面就来看看随机变量T(n)的期望值,计算过程如下图所示。


到了这一步,当然就使用替换法(Substitution Method)来求解这个递归表达式。



这样,就得到了随机化选择算法运行时间的复杂度期望是Θ(n)。比较糟糕的是,最坏情况下的时间复杂度是Θ(n^2)。不禁会有一个疑问:如果最坏情况下的复杂度是Θ(n)就更好了,所以如何剔除这个最坏情况并以某种方式避免随机性保证最坏情况下复杂度也是Θ(n)。这可以做到,但这是非同一般的算法,是目前我们接触过的算法中最复杂的一个,由几个牛人Blum,Floyd,Pratt,Rivest和Tarjan在1973年提出。

二、最坏情况下线性时间顺序统计

这个算法的核心思想是保证好的主元(pivot)。随机主元看起来是个好方法,最简单的方法正是随机选一个很大概率上讲都会很好。但我们想选出一个确实很好的主元,新想法是递归地生成主元。如果递归地求解半个问题,我们需要多做一个线性复杂度的工作,就像递归排序一样,T(n) = 2T(n/2) + Θ(n),这时的算法复杂度是nlogn。所以我们不能递归地分成两半,必须做的更好。所以这个递归的复杂度必须严格小于n,这算法的神奇之处正是在此。算法思想如下图所示。


上图中左边是算法复杂度分析,后面会用到,现在忽略之。接下来结合图例来分析一下算法为什么是可行的。



接下来分析该算法的时间复杂度,如第一幅图中左侧的分析,已得到如下的递归分析式。利用替换法即可解出。


为什么这个算法是将5个元素划为一组,为什么不将三个元素划为一组呢?因为三个元素为一组的话结论不成立,找出其中的原因是非常有用的。如果你能算出用三个元素为一组代替五个元素为一组的情况下问题的解,你会发现你本应该理解却没有理解的问题的本质:5是这个算法能成功的最小数字,7个元素为一组算法也能成立,但是理论上性能不会提高多少。


关于Introduction to Algorithms更多的学习资料将继续更新,敬请关注本博客和新浪微博Sheridan。

原创粉丝点击