一个n个整数序列取m个数,使其概率相同问题
2012-11-06 23:54
204 查看
转:http://blog.csdn.net/jay1002008/article/details/6877914
这是今天上午在同济笔试百度的题目,当时没做出来,那个郁闷,现把思路放在此处纪念已逝的笔试。
原题大概是这样的:一个服务器一天内会收到很多request,但是服务器只能存放m个request,试设计一种算法,使得在时时的reqest中选择m个保存,并保证最后各个request被选中的概率为大致相同。记住,不到最后,不知道request的总数n.
其实,这个题目可以这样解:
前m个request依次放入服务器中,当第m+1个来临时,以m/(m+1)的概率选中,并在已保存的m个request中等概率选择一个替换之。当第m+2个来临时,以
m/(m+2)的概率选中,并在已保存的m个request中等概率选择一个替换之。 依次类推,第N个request以m/N的概率被选择,并在已保存的m个request中等概率选择一个替换之。最终每个request被选择的概率为m/n.
证明如下(数学归纳法):
当n=m+1时,第m+1选中的概率为m/(m+1),而第一个被选中的概率为:1/(m+1) + m/(m+1) * (m-1)/m = m/(m+1);
假设当n = N时,每个request被选择的概率为m/N;
现证明当n = N+1时,每个request被选择的概率为m / (N+1).
第N+1个被选中的概率当然为m/(N+1),而第一个request被选择的概率为:m/N * ( (N+1-m)/(N+1) + m/(N+1) * (m-1)/m = m / (N+1);其余request被选择的概率也一样,得证当n = N+1时,每个request被选择的概率为m / (N+1)。
综上得,第方法可以实现最最终每个request被选择的为m/n.
这是今天上午在同济笔试百度的题目,当时没做出来,那个郁闷,现把思路放在此处纪念已逝的笔试。
原题大概是这样的:一个服务器一天内会收到很多request,但是服务器只能存放m个request,试设计一种算法,使得在时时的reqest中选择m个保存,并保证最后各个request被选中的概率为大致相同。记住,不到最后,不知道request的总数n.
其实,这个题目可以这样解:
前m个request依次放入服务器中,当第m+1个来临时,以m/(m+1)的概率选中,并在已保存的m个request中等概率选择一个替换之。当第m+2个来临时,以
m/(m+2)的概率选中,并在已保存的m个request中等概率选择一个替换之。 依次类推,第N个request以m/N的概率被选择,并在已保存的m个request中等概率选择一个替换之。最终每个request被选择的概率为m/n.
证明如下(数学归纳法):
当n=m+1时,第m+1选中的概率为m/(m+1),而第一个被选中的概率为:1/(m+1) + m/(m+1) * (m-1)/m = m/(m+1);
假设当n = N时,每个request被选择的概率为m/N;
现证明当n = N+1时,每个request被选择的概率为m / (N+1).
第N+1个被选中的概率当然为m/(N+1),而第一个request被选择的概率为:m/N * ( (N+1-m)/(N+1) + m/(N+1) * (m-1)/m = m / (N+1);其余request被选择的概率也一样,得证当n = N+1时,每个request被选择的概率为m / (N+1)。
综上得,第方法可以实现最最终每个request被选择的为m/n.
相关文章推荐
- 一个n个整数序列取m个数,使其概率相同问题
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 输出一个整数序列中与指定数字相同的数的个数
- 一个有点意思的SQL问题(连续的序列并且值相同的用区间来体现)
- 最大子序列问题:给定一整数序列A1,A2,A3...An(可能有负数),求A1~An的一个最大子序列Ai~Aj的和。
- 每天学习一算法系列(27)(输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序)
- cp后文件时间会变, mv后文件时间不会变化------定位一个低概率core问题时, 差点误导了自己
- 编写一个方法,洗一副牌。要求做到完美洗牌,换言之,这幅牌52!种排列组合出现的概率相同。假设给定一个完美的随机发生器
- 小a和小b一起玩一个游戏,两个人一起抛掷一枚硬币,正面为H,反面为T。两个人把抛到的结果写成一个序列。如果出现HHT则小a获胜,游戏结束。如果HTT出现则小b获胜。问a获胜的概率?
- poj3468一个简单的整数问题,我昨天一下午才写好的水代码。
- 整数序列合并问题
- 输入一个正数n,输出所有和为n连续正整数序列
- 判断一个数是否能分解为某个连续正整数序列之和
- 逆转一个整数的二进制表示问题
- 一个整数的二进制序列倒置后再转换为十进制的整数
- 给定一个函数rand5(),使函数rand7()可以随机等概率的生成1-7的整数
- 将一个整数转换为单个字符输出函数实现的细节性问题
- 求一个数组的最长递增子序列(动态规划经典问题)