概率分析和随机算法

1.雇佣问题

​ 雇佣代理向你推荐合适的候选人,每次推荐需要一笔代理费用。如果新候选人比在岗的候选人好,则决定聘用,这就需要向雇佣代理付一大笔中介费用。在这个过程中,只考虑向雇佣代理支付的费用,且每次遇到更好的候选人都辞去当前的在岗的候选人。

1
2
3
4
5
6
7
HIRE-ASSISTANT(n)
best = 0 //dummy候选人,默认为最差的
for i = 1 to n
interview candidate i
if candidate i is better than candidate best
best = i
hire candidate i

面试的费用设为cic_i,雇佣的费用设为chc_h,设雇佣的人数为mm,则总费用为O(cin+chm)O(c_in+c_hm)。其中面试费用一定,而雇佣费用不一定。

最坏情形 应聘者质量按出现次序严格递增,相当于对每个面试的人都雇佣了一次(每次都把上一次的人辞退然后招新人)

概率分析 首先假设关于输入的分布,然后分析该算法,计算出一个平均情形下的运行时间。在此问题中,我们用1到n将这些应聘者标号,而令rank(i)rank(i)表示应聘者ii的名次,并约定若rank(i)>rank(j)rank(i)>rank(j),则代表ii号比jj号优秀,这n个应聘者的优秀程度序列具有n!n!种,且每种都是等概率的。

随机算法 一个算法的行为不仅由输入决定,也由随机数生成器的数值决定,规定RANDOM(a, b)RANDOM(a,\ b)代表返回一个aabb之间的整数(包含边界),且每个结果概率相等。一般而言,对于算法的输入服从某种概率分布时,我们分析平均情况运行时间;当算法本身做随机选择时,我们分析期望运行时间。

指示器随机变量 形如

I{A}={1 如果A发生0 如果A不发生I\{A\}=\begin{cases} 1\ 如果A发生\\ 0\ 如果A不发生 \end{cases}

引理 给定一个样本空间S和S中的一个事件A,设XA=I{A}X_A=I\{A\},那么E[XA]=Pr{A}E[X_A]=Pr\{A\},由期望定义很容易得出。

​ 总和的期望等于n个随机变量期望值的总和,无论随机变量是否存在依赖关系

雇佣问题的分析

​ 设XX是一个随机变量,其值就等于整个过程雇佣了多少次。那么,平均情况下,E[X]=x=1nxPr{X=x}E[X]=\sum_{x=1}^nxPr\{X=x\},这种计算很麻烦,因此我们采用指示器随机变量。

Xi=I{应聘者i被雇佣}={1 如果应聘者i被雇佣0 如果应聘者i不被雇佣X_i=I\{应聘者i被雇佣\}=\begin{cases}1\ 如果应聘者i被雇佣\\ 0\ 如果应聘者i不被雇佣 \end{cases}

​ 问题转化为分析应聘者ii被雇佣的概率,这表明应聘者ii比之前的i1i-1人都优秀,由于应聘者以随机顺序出现,因此这ii个人每个人都等可能是目前最有资格的,因此我们得到E[Xi]=Pr{Xi=1}=1iE[X_i]=Pr\{X_i=1\}=\frac{1}{i}

​ 因此,

\begin{align*} E[X]&=E[\sum_{i=1}^n X_i]\\ &=\sum_{i=1}^nE[X_i]\\ &=\sum_{i=1}^n1/i\\ &=\mathrm{ln}n+O(1) \end{align*}

​ 结论是,我们尽管面试了nn个人,但平均只雇佣了lnn\mathrm{ln}n个人

随机算法 确定性算法对于任何不变输入,雇佣新应聘者的次数不会发生改变,我们对于某些排名序列,例如{5, 2, 1, 8, 4, 7, 10, 9, 3, 6},依次面试,则在任何情况下我们都会雇佣3次,即在遇到排名为5,8,10的人时(数字越大代表越优秀)。但对于随机算法来说,我们让随机发生在算法上,而不是输入分布上。

1
2
3
4
5
6
7
8
RANDOMIZED-HIRE-ASSISTANT(n)
randomly permute the list of candidates
best = 0
for i = 1 to n
interview candidate i
if candidate i is better than candidate best
best = i
hire candidate i

它们区别就在于多了第一步:随机生成一个序列,或者理解为将给定名单打乱顺序。我们在分析确定性算法时,是假设输入是某种分布,但对于随机算法而言,相当于设定好了某种概率分布,因此不再需要通过假设来分析了。

在线雇佣问题

假设我们现在不追求雇佣严格意义上最好的应聘者,因为我们不希望不停雇佣新人解雇旧人,每次面试,我们要么拒绝,要么马上提供职位,无论后面是否有更好的应聘者。我们如何在最小化面试次数和最大化应聘者质量之间取得平衡?我们采取一个策略,每次面试都给应聘者一个唯一的分数,并做好记录。对于n个应聘者,选择一个正整数k<nk<n,面试然后直接拒绝前kk个应聘者,在雇佣后面遇到的比前kk个应聘者分数都高的第一个应聘者,如果后面没有遇到超过前kk个应聘者分数的应聘者,则雇佣最后一个应聘者。

1
2
3
4
5
6
7
8
9
ON-LINE-MAXIMUM(k, n)
bestscore = -INF
for i = 1 to k
if score(i) > bestscore
bestscore = score(i)
for i = k + 1 to n
if score(i) > bestscore
return i
return n

那么我们如何确定下来这个kk的值使得得到的结果是最好的呢?

​ 设M(j)=max1ij{score(i)}M(j)=max_{1\le i\le j}\{score(i)\}表示应聘者1j1~j中最高分数。设SS表示成功选择了最好的应聘者(没有错过),SiS_i表示成功选择了最好的应聘者且他是第ii个面试者。那么Pr{S}=i=1nPr{Si}Pr\{S\}=\sum_{i=1}^nPr\{S_i\},根据规则,不选前kk个人,则对于ik, Pr{Si}=0i\le k,\ Pr\{S_i\}=0,因此Pr{S}=i=k+1nPr{Si}Pr\{S\}=\sum_{i=k+1}^nPr\{S_i\},那么如何计算SiS_i发生的概率?它要发生则必须满足(1)最好的应聘者本身在位置ii,设为BiB_i,(2)从k+1k+1i1i-1的人不能比前kk个人分数高,否则会被提前选走,设为OiO_i,且二者独立,因为OiO_i依赖于前i1i-1个人的分数顺序,BiB_i依赖于ii位置相比于前后所有位置的分数值。改变前i1i-1人的分数顺序并不影响第ii个位置是否比他们及其后面的分数都大,而改变第ii个人的分数使其不大于剩下任意的人,也根本不会改变前i1i-1人的顺序。

Pr{Si}=Pr{BiOi}=Pr{Bi}Pr{Oi}Pr{Bi}=1/nPr\{S_i\}=Pr\{B_i\cap O_i\}=Pr\{B_i\}Pr\{O_i\}\\ Pr\{B_i\}=1/n

​ 若使得OiO_i发生,则需要保证前i1i-1个人的最大分数落在前kk个人里,否则会导致提前选中,因此Pr{Oi}=k/(i1)Pr\{O_i\}=k/(i-1)

​ 综上,

Pr{S}=i=k+1nPr{Si}=i=k+1nkn(i1)=kni=kn11iPr\{S\}=\sum_{i=k+1}^nPr\{S_i\}=\sum_{i=k+1}^n\frac{k}{n(i-1)}=\frac{k}{n}\sum_{i=k}^{n-1}\frac{1}{i}

​ 由于

kn1xdxi=kn11ik1n11xdx\int_k^n\frac{1}{x}\mathrm{d}x\le\sum_{i=k}^{n-1}\frac{1}{i}\le\int_{k-1}^{n-1}\frac{1}{x}\mathrm{d}x

​ 因此

kn(lnnlnk)Pr{S}kn(ln(n1)ln(k1))\frac{k}{n}(\mathrm{ln}n-\mathrm{ln}k)\le Pr\{S\}\le\frac{k}{n}(\mathrm{ln}(n-1)-\mathrm{ln}(k-1))

​ 我们求使下界最大的kk,对kk求导得到lnnnlnk+1n\frac{\mathrm{ln}n}{n}-\frac{\mathrm{ln}k+1}{n},因此当k=n/ek=n/e时,取最大值,此时成功雇佣到最好的应聘者的概率至少为1e\frac{1}{e}