5. Probabilistic Analysis and Randomized Algorithms——Introduction to Algorithms Third Edition

来源:互联网 发布:js复制对象副本 编辑:程序博客网 时间:2024/05/20 19:19

Chapter 5. Probabilistic Analysis and Randomized Algorithms

本章围绕 Hiring Problem(雇用问题)展开讨论,雇用问题是指在依次求职的面试者中,选出比当前在职者优秀的并替换之,问平均替换的次数。从程序上来说就是扫一遍数组的问题,但结合实际情况辞退一个人要比面试的代价高得多,因此问题的注意力集中在替换的次数而非面试的次数。类比于找最大值,就是要问遍历过程中赋给最大值语句的执行次数。

要点:Probabilistic Analysis, Randomized Algorithms, Uses. (概率分析,随机算法,应用)

  • Probabilistic Analysis

我觉得本章之前有必要回顾下基本的概率论知识。(参考附录C)

在进行概率分析之前,需要对问题的输入情况进行假设,对于雇用问题,需要假设依次来面试者的水平是随机的,也就是说如果提前知道他们所有人的水平,输入的序列等可能的等于n!排列里面的任意一个,称之为uniform random permutation

Indicator random variables(0-1随机变量),指随机变量X的取值不是0就是1。如果是等概率0-1随机变量,那么其期望,即一次试验中X=1事件的期望E[X]=1/2。再设随机变量Y为试验n次,其中X=1事件发生的次数,那么Y就等于0-1变量X的值的和,类似于伯努利试验的二项式分布,其期望E[Y]=n/2。

由此来分析雇用问题:设雇用问题中随机变量Y表示替换次数,0-1变量X=1表示本次面试后雇佣,分析过程与上面类似,但不同的是第i次雇佣的概率不再是1/2,而是1/i,故得到的结果是E[Y]=lnn+O(1)。

  • Randomized Algorithms

要说随机算法是个比较水的东西,有了前面的讨论,概率分析唯一需要做的假设是问题的输入需要符合一定的概率分布,而随机算法为了去掉这种假设,在程序中引入随机数来打乱输入,因此就不用假设输入的概率分布。而在本书中,用概率分析得到的复杂度称为average-case cost,用随机算法得到的称为expected cost。

另一个值得讨论的问题是,如何让程序随机打乱输入?书中介绍了两种方法,第一种给每一个元素赋于一个随机数,然后排序,并且证明了这种算法可以等概率的得到n!个排列中的任意一个。第二种是一种本地排列算法,扫一遍数组,每次从其右边的序列里随机找一个元素与自己替换。(参考std::random_shuffle,例题5.3-2类似但完全不同,还有一个类似概率问题叫蓄水池抽样算法,其主要解决从动态增加集合中等概率选出部分数)

  • Uses

5.4节最后这几个问题值得一看,证明复杂的,感受下答案也不错。

第一个问题The birthday paradox,得到两种结果,一个解释了k个人生日都不同的概率最多是1/2的k的取值(k>=23);第二个给出了k个人中生日相同的人数的期望表达式:k(k-1)/2n。主要记住,这两个情况复杂度都是Θ(sqrt(n))

    杂碎:

    • editing