雇用问题
5.1 雇用问题
- 初始化一个虚拟应聘者,它比所有应聘者都差
- 每次面试一个人
- 每次面试需要支付一小笔费用
- 应聘一个人需要支付一大笔费用
- 目前面试的人比之前的更加出色就直接聘用
- 评估所需花费
//hire-assistant(n)
//hire(雇) assistant(助理) interview(采访,面试,访谈) candidate(候选人)
int best = 0;
for(int i=1;i<=n;i++){
interview candidate i;
if(candidate is better than candidate best)
best = i;
hire candidate i;
}
-
这个算法的独特在于我们关注的并不是算法的运行时间而是花费费用,但其实分析逻辑还是很像的
-
\[设面试所花费的费用为c_i,雇用的花费为c_h,雇用人数是m \]
-
\[O(c_in+c_hm)为总费用 \]
-
\[c_in是一个定值,只关注c_hm \]
-
-
最坏情况分析
-
当candidate是递增排序的话,那每一次interview都会hire,则花费为
-
\[O(c_hn) \]
-
然而并不是所有情况都这么坏,我们自然想知道在一种平均状态或者说是随即状态下的花费。
-
-
概率分析
- 分析问题时使用概率的概念,一般用于分析算法运行时间,有时也用于分析其他量,比如在hire-assistant算法中去分析花销。
- 当可以确定一个合理的输入分布时,可以使用概率分析,反之不可。
- 在hire-candidate中,我们可以假设应聘者随机出现。
-
随机算法
- 一般的如果一个算法行为不仅由输入决定,而且也由随机数生成器(random-number-generator)产生的数值所决定,那么我们称这个算法时随机的。
- 在实践中,大多数编程环境会提供一个伪随机数生成器,它是一个确定的算法,返回值在统计上看起来是随机的。
- 当概率分布是在算法的输入上时,我们讨论的是平均情况运行;当算法本身做出随机选择时,我们讨论其期望运行时间。