java生日悖论_【算法导论】概率分析和随机算法

12db16e9a771bd3208619d29e05133e0.png

1 雇佣问题

假如你要雇佣一名新的办公助理。你承诺在任何时候,都要找到最合适的人来担任这项任务,且只能有一个人被雇佣,当雇佣新的人时,之前的要解雇,同时还要支付给中介一大笔中介费。

我们假设面试的费用是c_i,雇佣的费用为c_h,下面看伪代码:

18a57ecb5ba977803413d75420cffbc8.png

显然,在任何情况下都需要面试n次,而雇佣的次数越少,代价也就越低。

但是在最坏的情况下(受聘者能力依次递增),我们的代价依然很大,如果我们能尽量减少雇佣次数,那么我们的代价就会降低。

那么我们怎么避免有序的输入呢?那就是使用一个随机算法,将输入的序列打乱,避免输入有序。

2.指示器随机变量

我们引入一个概率与期望之间提供转换的一个便利的方法:指示器随机变量:

8b38bdee7f5beec9d5406efb979adc40.png

举个例子,我们来确定抛硬币时正面朝上的期望次数,正面朝上则值为1,否则为0。

48f10cd7fab985409fb9867b41cb94d3.png

因此正面朝上的期望次数就变成指示器的期望值:

b8fa9c61b039452aaa6ab60b21c928f7.png

因此抛掷一枚硬币正面朝上的概率就是1/2。

2.1 用指示器随机变量分析雇佣问题

我们假设应聘者以随机的顺序出现,定义第i个应聘者被雇佣这个事件的指示器随机变量。

d933c8b5f7960e53b7875728fc841acd.png

而X = X_1 + X_2 + … + X_n

因此X的期望:

258ba2ba33548049285f066996b884c3.png

因此,尽管我们面试了n个人,但是我们只雇佣其中lnn个人,代价显著下降。

3.随机算法

随机算法对于最坏输入,往往会破坏这种最坏的序列,产生一个较好的输入来改善算法,而对于一些已经很好的输入(如雇员问题中,输入递减,这种情况下只会雇佣一次),随机化之后则相对于原输入的代价更大。也就是说随机化并不一定能降低代价,只是即使最坏的输入也无法产生最大的代价,因为随机排列使得输入次序不再相关(除非随机数生成器产生一个“不走运”的排列)。

4.概率分析和指示器随机变量的进一步使用

4.1 生日悖论

Q:一个屋子要有多少人才能达到其中两人生日相同的机会达到50%?

我们假设:

f4a269d7952f20789336a2a2e3f69ee5.png

对于i和j在同一天过生日的概率(假设一年的天数为n):

965c12e73a961ee8c55a57693b02a231.png

那么相同的概率,需要再乘上一年的天数n:

be43bcd54521355293d50e4ca29173f5.png

那么有:

891c7e6f37ce2bf576c2390d1b904882.png

计算期望:

7504477c5e81bbddbf9868f6b26190da.png

那么当我们期望为1/2时,我们计算k(k-1)=n,求解k约为28人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值