注意:大家可以先学习一下概率论再来看第5章。
一、问题引入
1、问题条件组成
①你要雇佣一个新的办公助理,你决定找一个雇用代理,这个雇用代理每天会给你推荐一个应聘者。
②你面试这个应聘者,如果应聘者好于你现任办公助理,就辞掉这个办公助理,将这个应聘者雇用,同时也需要付钱给雇佣代理。
③估算该费用是多少。
2、伪代码
HIRE-ASSISTANT(n)
//candidate 0 is a least-qualified dummy candidate(第一个雇佣者编号为0,比其他雇佣者更差)
1 best = 0
2 for i = 1 to n
3 interview candidate i
4 if candidate i is better than candidate best
5 best = i
6 hire candidate i
3、分析
我们在这里分析的是费用,面试费用较低,我们设置为Ci,雇佣成本较高,我们设置为Ch,雇佣人数为m,面试n个应聘者,因此总费用为
因为总人数n是确定的,因此我们只关注成本更高而且会随着算法的执行变化的Ch*m。
二、最坏情况分析
1、在最坏情况下,这n个应聘者的质量是递增的,那么我们要雇佣n次,总费用为
2、当然这种情况不可能次次发生,我们一般只会问在平均情况下会发生什么,从而引出我们对概率的分析。
三、概率分析
1、大多数情况下概率分析运用于分析一个算法的运行时间,比如说求雇佣问题的费用,为了进行概率分析,我们必须要使用或者假设输入的分布,然后分析算法,计算出一个平均情形下的运行时间,我们对所有可能的输入分布求平均值,实际上是对所有的运行时间取平均。我们称其为平均情况运行时间。
2、在雇佣问题中,我们假设所有应聘者都是以随机顺序出现的,这意味着任何两个应聘者可以进行比较从而决定谁更加合适,那么这里存在一个全序关系。n个应聘者一共有n!种排列方式,在这n!种排列方式中,每一种情况的概率是相等的。
四、随机算法
1、一般情况下我们对输入分布的了解很少,因此我们需要通过算法使程序中某部分的行为随机化,我们常常可以使用概率和随机性作为算法设计的工具。
2、在雇用问题中,我们设计一个随机算法,对面试应聘者的次序有更大的控制,加强随机性。
3、如果一个算法的行为不仅由输入决定,也由随机数生成器产生的数值(random-number-generator)决定,那么我们称这个算法是随机的(Randomized),比如说RANDOM(0,1)产生0和1的概率都是50%。
4、分析一个随机算法的运行时间,我们以运行时间的期望值衡量,输入值由随机数生成器产生,我们将一个随机算法的运行时间称为期望运行时间。
注意:在第5章后续内容中也会继续讲这个案例。