一个n个整数序列取m个数,使其概率相同问题
2011-10-16 15:53
309 查看
这是今天上午在同济笔试百度的题目,当时没做出来,那个郁闷,现把思路放在此处纪念已逝的笔试。
原题大概是这样的:一个服务器一天内会收到很多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个数,使其概率相同问题
- 输出一个整数序列中与指定数字相同的数的个数
- 最大子序列问题:给定一整数序列A1,A2,A3...An(可能有负数),求A1~An的一个最大子序列Ai~Aj的和。
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 一个有点意思的SQL问题(连续的序列并且值相同的用区间来体现)
- 一个js Tree 的问题,当id为整数时,可以获得值,当id为“ff100”的数字字母混合是就出现错误,请高手指点一下
- 每天学习一算法系列(27)(输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序)
- JAVA问题总结之23--生成一个长度为100的随机整数list
- 一个无序整数数组中找到最长连续序列(Longest Consecutive Sequence)和两个元素使得相差最小
- 在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k。
- 微软算法100道题-------输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
- 逆转一个整数的二进制表示问题
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 整数划分问题:输出一个整数的所有划分并统计总划分数
- 编写一段程序,从标准输入读取string对象的序列直到连续出现两个相同的单词或者所有单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次是使用break语句终止循环。输出连续重复出现的单词,或者输出一个消息说明没有人任何单词是重复出现的。
- 【练习】输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序
- poj3468一个简单的整数问题,我昨天一下午才写好的水代码。
- 编程题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列