算法导论5.2-2雇佣问题

题为:在HIRE-ASSISTANT中,假设应聘者以随机顺序出现,你正好雇佣两次的概率是多少?

HIRE-ASSISTANT重点讨论的是,使用列表遍历选最大值的交换开销,雇佣两次即交换两次。

从题可知:

1. 第一个肯定被雇佣

2.最高个儿不可以在第一个位置

3.最高个儿和第一个之间的人都小于第一个

硬解法:

HIRE_TWO_HARD(s)
for i=2 to n
    for j=i-1 to n-1
        s += A(j-1,i-2)*A(n-i,n-i)
s  /=   A(n,n)
return s

其中A(m,n)为在n个位置中选m个随意坐的排列数,即n!/(n-m)!。代码附录1,阶乘代码附录2

i 为最高个儿所在位置,可以站第二个位置到最后个位置

j 为第一个人的实力的倒数排名,当他是倒数第一时,与最高个儿之间就不能站人了,中间有i-2个位置,供比第一个人实力差的选站,有j-1个比他实力差的,最高个儿后面的n-i个位置随意站。(这里i-2不一定大于j-1,所以A(m,n)当m>n时返回A(n,m)即可)

条件概率解法:

HIRE_TWO_CONDITION(s)
for i=1 to n-1
    s + = 1/i
s *= 1/n
return s

设事件E为第一个位置实力为i,P(E) = 1/n,n>i>0,完全随机

设事件F为,在E的条件下,实力大于i的一帮人站好队,正好排头是最高个,P(F | E) = 1/(n-i)

P{雇佣两个人} = P(F∩(E1∪E2∪...∪En-1) = (F∩E1)∪(F∩E2)∪...∪(F∩En-1)) = P(F | E)*P(E) (i=1 to n-1)

两者同解,但后者更有拓展性,当求三人时,只需对实力大于i的一帮人分解递归成,实力j和n的一帮人的处理。

附录1

A(m,n)
if( m =0 || n=0)
    return 1
if( m > n)
    return A(n,m)
return factorial(n)/factorial(n-m)

附录2

factorial(k)
s = 1
if( i <= 0)
    return 1
for k to 1
    s *= k
return s


你可能感兴趣的:(数据结构和算法)