5.1雇佣问题
面试一个人需要花费ci,雇佣一个人需要花费ch。当面试者比现有员工优秀时,就要雇佣他。因此伪代码为:
Hire-assistant(n)
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
假设雇佣m个人,则总花费: cin+chm
最坏情况需要花费:cin+chn
由于总会面试n个人,因此只讨论,雇佣的情况
5.2 指示器随机变量
给定一个样本空间S和一个事件A,那么事件A对应的指示器随机变量I{A}定义为:
I{A} = { 1 如果A发生
0 如果A不发生
引理5.1 给定一个样本空间S和S中的一个事件A,设XA = I{A},那么E[XA] = Pr{A}.
分析雇佣问题:
C.20 离散随机变量X的期望值是E[X] = Σx·Pr{X=x}
A.7
应聘者i被雇佣的概率为1/i
E[Xi] = 1/i
E[X] = E[Σ~i=1 to nXi~]
= Σ~i=1 to nE[Xi~]
= Σ~i=1 to n~1/i
=ln n+O(1)
引理5.2 假设应聘者以随机次数出现,算法总的雇佣费用平均情形下为O(ch*lnn)
5.3 随机算法
要使随机发生在算法上,而不是在输入的分布上。给定一个输入,随机选择执行的顺序。
伪代码为:
Hire-assistant-random(n)
1 randomly permute the list of candidates
2 best = 0
3 for i = 1 to n
4 interview candidate i
5 if candidate i is better than candidate best
6 best = i
7 hire candidate i
引理5.3 过程Hire-assistant-random的雇佣费用的期望是O(ch*ln n)
随机排列数组
给定一个数组A,包含元素1到n。目标是狗仔这个数组的一个随机排列。
1.为数组的每个元素A[i]赋一个随机的优先级P[i],然后根据优先级对数组A中的元素进行排序。花费Θ(nlgn)
permute-by-sorting(A)
1 n = A.length
2 let P[1…n] be a new array
3 for i =1 to n
4 P[i]= random(1, n3)
5 sort A, using P as sort keys
选1-n3, 是为了让P中所有的优先级尽可能都唯一。
引理 5.4 假设所有优先级都不同,则过程 permute-by-sorting 产生输入的均匀随机排列。
- 原址排列给定数组,在O(n)时间内完成。在进行第i 次迭代时,元素A[i]是从元素A[i]到A[n]中随机选取的。第i次迭代以后,A[i]不再改变。
Randomize-in-place(A)
1 n = A.length
2 for i = 1 to n
3 swap A[i] with A[random(i,n)]
引理5.5 过程 Randomize-in-place 可计算出一个均匀随机排列。
5.4 四个例子
生日悖论
对屋子里k个人中的每一对(i,j),对1<=i<j<=k,定义指示器随机变量Xij如下:
Xij=I{i和j生日相同} = {1 如果i和j生日相同
0 其他
Pr{i和j生日相同} = 1/n
由引理5.1 E[Xij] = Pr{i和j生日相同} = 1/n
设X表示生日相同的两人成对的数目
X=Σi=1 to kΣj=i+1 to k Xij
E[X]=E[Σi=1 to kΣj=i+1 to k Xij] = Σi=1 to kΣj=i+1 to k E[Xij] = k*(k-1)/2n
因此,k*(k-1) >=2n时,E[X]>=1.求得k = 28
渐近阶数为Θ(√n)
球与箱子
把相同的球随机投到b个箱子里,每次投球都是独立的,每一次投球,球可能落在每一个箱子中,球落在任意一个箱子中的概率为1/b。
- 如果投n个球,落在指定箱子里的数目为n/b
- 平均意义下,需要投b个球,才能在给定的箱子里投中一个球
- 要投n次球,才能使每个箱子里至少有一个球 (n个伯努利实验,几何分布)
成功的概率为(b-i+1)/b
E[ni] = 1/[(b-i+1)/b] = b/(b-i+1)
E[n] = E[Σ~i=1 to bni~] = Σ~i=1 to bE[ni~] = Σ~i=1 to b~( b/(b-i+1)) = b Σ~i=1 to b~(1/i) = b(lnb+O(1))
n>=blnb
特征序列
假设抛硬币n次,最长连续正面的序列的期望长度为Θ(lgn)
在线雇佣问题
面试后要么直接雇佣,要么直接拒绝,只雇佣一次,如何在最小化面试次数和最大化应聘者质量之间取得平衡?
策略:选择正整数k<n,拒绝前k个人,再雇佣后面比前k个有更高分数的第一个应聘者,如果最优的出现在前k个人中,那么雇佣第n个人。
当k=n/e时,至少1/e的概率成功雇佣到最好的应聘者。