基于概率的算法分析摘要

基于概率的算法分析摘要

有如下的算法:
HireAssitant()
{
Best=0;
For 1 to n
{
    Interview candidate I;
    If( candidate I is better than best)
    {
        Best = I;
        Hire I;
}
}
}
上述算法中,有两个地方会花费时间,一个是interview,一个是hire。不过我们可以忽略interview,因为它的代价较小,而且总需要执行n次。但Hire的代价较大,而且执行次数依赖于输入数据的顺序。

怎么计算这个算法的复杂度呢?
显然这和输入有关系,最坏情况下,如果输入是一个顺序排列的数组,那么每个都interview一次并hire一次。那么复杂度是O(nc).其中c是一个常数。

但是大多数情况下,并不会发生这样的事情。实际的输入是近乎随机的,一会儿来了个好的,一会儿来了个差的。假如你是人力资源的总监的话,你就需要估算一下在这种随机的情况下,时间花费是多少?
为了方便研究随机算法的复杂度,我们引入一个变量,I(A),它表明一个随机事件是否真的发生了。如果这个事件发生的概率是P,那么I的期望就是P。因此这个变量有助于在期望和概率之间进行转换。
当我们需要计算1000个样本事件中,期望发生多少次时,用I这个变量通常比较简单。比如每个产品是次品的概率是P,那么N个产品中次品的期望是多少?
一种算法是:Sum(k*包含K个次品的概率)其中K从1到n。经过复杂的计算可以得到期望是n*p。
如果通过I的话,I(x)表示第x个产品为次品。那么Sum(I(x))其中x从1到n就是要求的答案。由于I的期望就是x是次品的概率,所以n个p相加,自然就是np了。

如果我们用I来分析Hire算法的话,也是相当的简单的。
我们能设I(k)表示第k个候选的是被Hire的,那么就意味着k是前k个人中最好的一位。由于候选人员是随机分布的,前k个人中的最好的一个可以出现在k个位置中的任何一个,即是1/k。那么关于Hire次数的期望就是所有I(k)期望的总和。即是:
1+1/2+1/3+…1/n
我们知道1/x的积分是ln(x),所以上述和近似于ln(n)。

在上面的证明中,我们假设用户输入是随机的,但实际情况里,这可能不是事实。一个好的算法应该能保证在任何输入下都能在控制中运行。假设你宣传你的算法在10秒内完成,结果用户一个输入用了20秒,这时候你才想起最坏情况,恐怕已经晚了。

为了必然这种情况,有必要在算法中加入随机这一步,在算法的开始就将输入打乱成一个随机的序列。这样可以减少最坏情况的发生。

通常有两种方法来达到这一点,第一种是把n个输入与n个不同的随机数关联起来,对输入以相关联的随机数排序,这样输出的n个数具有更大的随机性。第二种是对n个输入中的每个数,依次与它后面的随机选的一个数进行交换。这样出来的结果是输入中的每个数以同等概率出现在输出中的每个位置。

最后一个概率的小题目。
在一个有n个人的房间里,出现两个人生日相同的概率是多少?
首先两个人生日相同的概率是1/365,忽略闰年。
N个人选两个的组合数是N*(N-1)/2。
所以概率是N*(N-1)/730.
这是一个有趣的结论,因为只要人数达到23,就会有超过50%的概率出现相同生日的人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章