概率问题与随机算法

我们来考虑一下下面这个雇佣问题:

假设你需要雇佣一名办公室助理,你决定找一名雇佣代理,他每天给你推荐一个应聘者,你面试这个人,然后决定是否录用他。

你承诺任何时候你都需要找最合适的人来担任这项职务.............我们来考虑一下这个费用会是多少;

下面的伪代码表示雇佣策略:


其实我们要分析的费用问题跟所要分析的时间复杂度问题是等价的:

面试的费用较低 假设为Ci,而雇佣的费用较高为Ch,所以为了找到最好的,把这n个人都面试了一遍,而录用了过其中m个人,最后只留下一个最好的;所以时间复杂度=O(Ci*n+Ch*m)=费用;

最坏情况:

如果我们每一次面试的人都要比上一个人好,这样我们一共面试了n个人,同时也录用过n个人,最后留下一个,此时产生的费用为最高;复杂度为O(Ci*n+Ch*n);

平均情况:

事实上,最坏情况发生的概率比较小,然而我们又不知道输入的分布,在这种条件下,我们很自然地会问在一种典型的情况下,或者平均情况下;


概率分析:

当分析一个算法运行时间时,我们以运行时间的期望值衡量,其中输入值是由随机数生成器产生。我们将一个随机算法的运行时间称为期望运行时间。

一般而言,当概率分布在算法的输入上时,我们讨论平均运行情况;当算法本身做出随机选择时,我们讨论其期望运行时间;


我们用随机算法分析上面这个问题:



这说明了平均情况比最坏情况下有了很大的改进;


很多时候我们无法得知输入分布的信息,因而阻碍了平均情况的分析;


随机算法:

输入的所有排列等可能出现往往有益,通过概率分析我们可以设计一个随机算法,一般我们不是假设输入的一个分布,而是设定一个分布。特别地,在算法运行前,先随机的排列应聘者,以加强所有排列都是等可能出现的;

下面是两种随机排列:

1.

将每一个要排序的A[i]赋给一个随机的优先级,然后根据优先级对数组A的元素进行排序;

产生随机排列的另一种更好的方法是原址排列给定的数组;


2.







猜你喜欢

转载自blog.csdn.net/lily559/article/details/80380360