概率分析与随机化算法
1. 指示随机变量
- 记某件事为A,定义Xa = I{A}为事件A的指示变量,并且其取值只能为0或者是1;0表示A事件未发生,1表示A发生;
- 样本空间 N = {n1, n2, n3…};记为所有的样本情况;
可得出引理:E[Xa] = P{A} ;
2. 雇佣问题
- 公司要雇佣一名员工,从n位员工中先面试再雇佣,最终得出能力最优秀的那一位。面试费用Ct,雇佣费用Ch,要求得出最经济的方式;
- 雇佣过程为,依次对所有人进行面试,如果一开始无人被雇佣,那么雇佣第一个员工;如果已经雇佣了某一位员工,那么比较当前员工是否比已雇佣员工能力强,是的话则解雇老员工,雇佣当前员工,否的话则继续下一轮面试;
每次雇佣费,不仅包含解雇上一个员工,还包括雇佣新员工的费用,所以成本比面试费用多得多。这里单纯从经济上考虑,总的成本 W = nCt + mCh,其中的m即为总过程中发生了m次雇佣(最坏情况是 m = n);那么如何对雇佣问题的成本进行一般性分析?
- 记Xi = I {第 i 号员工被雇佣},其取值只能为1,或者是0;即E[Xi] = 1表示第i号员工被雇佣的期望是1;
- 而P{Xi}即第i号员工被雇佣的概率(为1/i)该如何计算?已经面试了i-1个员工,而在面试第i个员工时进行雇佣,意味着第i个员工的能力值是最高的,根据输入n位员工的能力随机化分布,那么前面i位员工里,最高的那位出现在任意一位的概率都是1/i,所以其在第i位员工被雇佣的概率值也易知为1/i;
- 现在依次考虑1~n号员工,得出这一批面试中,雇佣次数的期望 m 为:
- 因此,得出结论,只要保证了n位员工的输入顺序为随机化分布,就可以保证是在对数级别的雇佣次数内完成对成本的控制;
- 如何保证输入是随机化分布?每次的自然情况下的多次输入可能还是一连串的最坏的情况, 注意此时的平均运行时间并不是我们所要求的期望运行时间,我们需要自行设计一个随机化算法,保证输入的随机化分布。
3. 随机化算法
3.1 随机排布数组
- 从1~n里头有放回的先后取两个数,他们相同的概率为 1/n ,不同的概率是(1-1/n);如何是3个数完全不同的概率呢?k个数完全不同的高概率呢?
- 可以这样考虑,依次对1~k个数进行分析,第一个数不同的概率是1,第二个进来时,2个数不同的概率是 1*(1-1/n),第3个数进来时,总共3个数,完全不同的概率是1*(1-1/n)(1-2/n),因此,k个数完全不同的概率为(1-1/n)(1-2/n)(1-3/n)…(1-(k-1)/n);
随机数组,就是先生成一个随机优先级的数组和对应元素绑定,然后利用数组大小对对应元素进行排序,最终可以将输入元素进行随机化处理,以达到目的;该算法证明可以等可能的产生{1,2…n}中的任意一个随机排列,因此证明是可行的,不过必须保证随机数得从[1,n^3]中随机产生才行。
3.2 洗牌算法
之前的随机数组方法,产生随机数时,n^3过大,很容易越界,不易于操作,洗牌算法能较好的较快又方便的完成这项任务。
- 对于 1~n 个元素,下标从0到 n-1 标定,然后从后往前,i 取 n-1 到 1,考虑第i个元素时,从[0,i)任意挑一个和第i元素进行互换。
其中之前面试时,也有被问到你知道哪些洗牌的算法,这就是最基础最常见的一种洗牌算法了。
4. 生日悖论
一个屋子到底需要达到多少人,才会满足存在两个人生日相同的概率超过1/2? 这个答案真的没有想象的那么大,运用数学的概率知识就很容易求解出来;
- 不妨假设屋子里有k个人,样本空间为S={1,2…365},总共大小为 n = 365;
- 考虑存在两个人生日相同的概率,不如考虑反面来的方便,即求算所有人生日完全不相同的概率P,那么存在两个人生日相同的概率即为(1-P),如之前提到的k个数完全不同的概率是 P1 = (1-1/n)(1-2/n)(1-3/n)…(1-(k-1)/n);
- 要满足 P = 1 - P1 > 0.5,即 P1 < 0.5;由于(1+x)<e^x(在R内都成立),所以上面P1< e^(-1/n) * e^(-2/n) * … * e^(-(k-1)/n) = e^(-k(k-1)/2n) < 0.5;可最终得到 k>=23即可以满足条件~