【算法导论】雇佣问题

你。 提交于 2019-11-26 14:25:24

首先介绍一点数学知识。

事件 A 的指示器随机变量I{A}I\{A\}定义为:
I{A}={1A0A I\{A\} = \begin{cases} 1 \quad 如果A发生\\ 0 \quad 如果A不发生 \end{cases}

指示器随机变量的期望为:
E[I{A}]=Pr{A}E[I\{A\}] = Pr\{A\},其中Pr{A}Pr\{A\}为事件A发生的概率。

期望性质:期望的和等于和的期望,即若X=XiX = \sum{X_i}, 则E[Xi]=E[Xi]E[\sum{X_i}] = \sum{E[X_i]}


雇佣问题:输入长度为n的数组 A[0, …, n-1], 其元素数值代表每个人的能力。假定初始时助手的能力为0, 且每次遇到能力高于当前助手能力的人,便辞掉当前助手,并雇佣该人. 每次雇佣需要花费费用chc_h,求总费用。

图示:假设 A = [2, 1, 3].
在这里插入图片描述
在上述例子中,一共雇佣了两次助手,花费为2ch2c_h.

上述过程的代码如下:

int hire( vector<int>& A){
    int now_ability = 0;
    int cost = 0;
    for( auto it : A)
        if( it > now_ability){
            now_ability = it;
            cost++;
        }
    return cost;
}

在上述代码中我们并不关注时间复杂度,反而关注雇佣费用。

最坏情况下,即数组 A 按顺序递增时,花费最大,为数组所有元素的和。


下面来关注雇佣问题中,雇佣一个新助理的期望。
假定应聘者已随机顺序出现,XiX_i对应第 i 人被雇佣,其指示器随机变量为:
Xi=I{i}={1i0iX_i = I\{第i位被雇佣\} = \begin{cases} 1 \quad 第i位被雇佣\\ 0 \quad 第i位未被雇佣 \end{cases}

在源代码中,若第 i 个人被雇佣,则意味着第 i 人比第 1~n-1人都优秀。又假定应聘者随机出现,所以前i个应聘者也按照随机次序出现,因此被认为前 i 中任何一个人都是等可能是目前最优秀的人,因此Pr[xi]=1i.Pr[x_i] = \frac{1}{i}.
又因E[I{A}]=Pr{A}E[I\{A\}] = Pr\{A\}, 因此E[I{Xi}]=1iE[I\{X_i\}] = \frac{1}{i}.
则令X=i=1nXiX = \sum_{i=1}^{n}X_i, 有
E[I{X}]=i=1n1i=1+12+...+1nE[I\{X\}] = \sum_{i=1}^{n} \frac{1}{i} = 1 + \frac{1}{2} + ... + \frac{1}{n}
由调和级数的性质可知,上式结果为:
E[I{X}]=lnn+O(1)E[I\{X\}] = lnn + O(1)

即,面试了 n 个应聘者,平均意义上也只雇佣了lnnlnn个人。

我的微信公众号

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!