九章算法面试题17 从输入流中随机取记录
来源:互联网 发布:淘宝店铺粉丝专享价 编辑:程序博客网 时间:2024/06/11 11:39
九章算法官网-原文网址
http://www.jiuzhang.com/problem/17/
题目
有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入流中等概率随机取得m个记录。
解答
开辟一块容纳m个记录的内存区域,对于数据流的第n个记录,以m/n的概率将其留下(前m个先存入内存中,从第m+1个开始),随机替换m个已存在的记录中的一个,这样可以保证每个记录的最终被选取的概率都是相等的。
面试官角度
这个题目除了需要给出正确解答以外,还需要证明你的解答。考察的是对概率随机问题的掌握情况和归纳法的运用。下面给出一个简单的证明:
设数据流中已经有n个记录流过,在内存中的m个记录中,假设都是等概率取得的,每个数命中的概率都为:mn。对于第n+1个记录,以mn+1的概率选中,如果没有选中,则内存中的m个记录均被留下来,每个数留下来其概率为:mn * (1-mn+1) = m(n+1-m)n(n+1);如果选中,新留下来的数概率自然是mn+1,而原来内存中的m个数中留下来m-1个数,每个数留下来的概率是:mn*mn+1*m-1m = m(m-1)n(n+1)。两种情况下概率之和为m(m-1)n(n+1)+m(n+1-m)n(n+1)=mn+1,即为原来被选中数,继续被选中的概率。由此我们不难得出,内存中每个数被选中概率一直都是mn。
0 0
- 九章算法面试题17 从输入流中随机取记录
- 九章算法面试题16 01随机生成函数
- 九章算法面试题26 方格取数
- 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从 这个输入 流中随机取得 m 个记录。
- 33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
- 从表中随机取记录,语句。
- 从输入流随机取数
- 九章算法面试题57 拷贝带随机指针的链表结构
- 中兴面试题 : 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m. --java算法解决方法。
- 从表中随机取5条记录
- 九章算法面试题3 找坏球
- 九章算法面试题28 链表找环
- 九章算法面试题71 平方根
- 九章算法面试题74 中位数
- 从oracle表中随机取记录,产生随机数和随机字符串
- 从oracle表中随机取记录,产生随机数和随机字符串
- 从oracle表中随机取记录,产生随机数和随机字符串
- 从oracle表中随机取记录,产生随机数和随机字符串
- redhat5安装yum
- ln 用法,知识(软链接和硬链接)
- CSS中不为人知Zoom属性的使用介绍(IE私有属性)
- MongoDB JAVA API高级查询示例(对应于上一篇)
- apache 配置文件
- 九章算法面试题17 从输入流中随机取记录
- Android 内存管理机制
- Java web基础总结七之—— Filter与Listener
- GridFS详细分析
- #ifdef _DEBUG #define new DEBUG_NEW #endif
- canvas画布清空问题
- JVM内存模型及垃圾回收机制
- Remove Element ——结题报告
- 安装DSPC