一、雇佣问题
(给定输入实例,算法的每次执行结果相同)
**问题:**面试n个人,雇用一个职员。雇用原则,在面试第i个人时,如果该面试者比前面所有面试者都好,就录用。已知面试代价为Ci,录用代价为Ch,请问成本为多少?
HIRE-ASSISTANT(n)
best ← 0 --> candidate 0 is a least-qualified dummy candidate
for i ← 1 to n
do interview candidate i
if candidate i is better than candidate best
then best ← i
hire candidate i
雇佣问题成本的概率分析
二、随机算法
(给定输入算法多次运行结果不一定相同)
RANDOMIZED-HIRE-ASSISTANT(n)
randomly permute the list of candidates
best ← 0 →candidate 0 is a least-qualified dummy candidate
for i ← 1 to n
do interview candidate i
if candidate i is better than candidate best
then best ← i
hire candidate i
方法一:
PERMUTE-BY-SORTING(A)
n ← length[A]
for i ← 1 to n
do P[i] = RANDOM(1, n3)
sort A, using P as sort keys
return A
分析:
- 各优先数唯一的概率为≥1-1/n
- 算法运行时间为Θ(nlgn)
- line 4 sorting, 使用合并排序等
- Lemma 假定各优先数唯一,则算法产生的是输入的均匀随机排列
方法二:
(就地枚举,一般就地算法指的是辅助空间为C,与n无关)
RANDOMIZE-IN-PLACE(A)
n ← length[A]
for i ← 1 to n
do swap A[i] ↔ A[RANDOM(i, n)]
分析:
- 算法运行时间为Θ(n),line 2 for循环
- Lemma 算法产生的是输入的均匀随机排列
三、在线雇佣问题
原则:面试每位申请者,立即决定去留
折衷:最小化面试的人数 vs. 被录用者质量最优(两者矛盾)
方法:
打分:score(i),并且假定分数唯一
选择一个正整数k:对前k个人,只记分不录用;此后出现的第一个高分者被录用;若后n-k个人分数低于先前的最高分数者,录用第n个人
ON-LINE-MAXIMUM(k, n)
bestscore ← -∞
for i ←1 to k
do if score(i) > bestscore
then bestscore ← score(i)
for i ← k + 1 to n
do if score(i) > bestscore
then return i
return n
分析:
假设k固定,
为前j人最高分;
事件
:成功地选取最优者;
事件
:成功地选取最优者,并且是第i人;
因为:
故:
满足的情况:
- 事件 :最优者在i产生;
- 事件 :位置 上的申请者未被选中;
事件
与事件
相互独立,故
;
又因为
;
所以:
;
由积分不等式
,可得:
;
令下界最大,对k求导可得
;
令其为零,得
;
}(\ln (n-1)-\ln (k-1))
\frac{1}{n}(\ln n-\ln k-1)
k=\frac{n}{e}
k=\frac{n}{e}
\frac{k}{n}(\ln n-\ln k)=\frac{1}{e}$