谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 1000 个关键字?
来源:互联网 发布:索拉算法 编辑:程序博客网 时间:2024/04/20 06:39
定义长度为 1000 的数组。 对于数据流中的前 1000 个关键字,显然都要放到数组中。 对于数据流中的的第 n(n>1000)个关键字,我们知道这个关键字被随机选中的概率为 1000/n。所以我们以 1000/n 的概率用这个关键字去替换数组中的随机一个。这样就可以保证所有关键字都以 1000/n 的概率被选中。 对于后面的关键字都进行这样的处理,这样我们就可以保证数组中总是保存着 1000 个 随机关键字。
1、总数n<=1000时,则n个关键字以P=100%的概率放到数组中
2、n=1001时,可以想象成一共有1001个位置。题目要求,所有关键字都以1000/1001的概率被选中。
证明:
第1个关键字被选中的概率=第1个位置未被第1001个关键字占用的概率
一共有1001个位置,第1个位置未被第1001个关键字占用的概率p=1000/1001
同理,第2个关键字被选中的概率=第2个位置未被第1001个关键字占用的概率=1000/1001
同理,第3-1000个关键字被选中的概率=1000/1001
第1001个关键字被选中的概率=占用前1000个位置的概率=1000/1001
3、n=1002时,可以想象成共有1002个位置。按照题目要求,所有关键字都以1000/1002的概率被选中
证明:
第1个关键字被选中的概率=第1个位置未被第1001个且未被第1002个关键字占用的概率
设事件A为第1个位置未被第1001个关键字占用,事件B为第1个位置未被第1002个关键字占用
根据条件概率公式P(AB)= P(A)*P(B/A),得:P(1) = (1000/1001) * (1001/1002) = 1000/1002;【p(i)表示第i个关键字被选中的概率】
同理2-1000个关键字被选中的概率,P(i)=1000/1002,(2<= i <=1000)
第1001个关键字被选中的概率=第1001个关键字占用1-1000中某个位置,且该位置未被第1002个关键字选中的概率
p(1001) = (1000/1001)*(1001/1002)=1000/1002.
p(1002) = 1000/1002
依次类推……
对于后面的关键字都进行这样的处理,这样我们就可以保证数组中总是保存着 1000 个 随机关键字。
- 谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 1000 个关键字?
- 谷歌面试题:从无穷尽的流中随机的选取1000个关键字(蓄水池抽样)
- 谷歌面试题:从无穷尽的流中随机的选取1000个关键字(蓄水池抽样)
- 搜索包含关键字的文本
- win7系统怎么搜索文件中包含的关键字?(批量搜索多个文件)
- php 根据给定的一个查询关键字,获取百度的相关关键字,多个页面获取,非单页的相关搜索
- 搜索包含指定关键字的存储过程
- grep 搜索不包含关键字的行
- 搜索关键字的重要性
- win7系统,怎么搜索文件中包含的关键字?
- 根据关键字搜索的一个存贮过程
- 处理列表中搜索的关键字变色
- 搜索的关键字变颜色
- Jquery搜索页面的关键字
- 搜索学习资源的关键字
- 在man中搜索指定章节的关键字
- 在一堆文本文件中搜索内容含关键字的文件
- 在XML数据库中高效的关键字搜索求SLCAs
- CodeForces 55D Beautiful numbers
- android生成apk时报错:Dx 1 error; aborting
- Hard limits for "maximum open file descriptors"
- python手记(12)
- android自定义实现抽屉SlidingDrawer的功能
- 谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 1000 个关键字?
- uva10271 - Chopsticks(巧妙动归)
- Android ListView分页加载数据Demo
- eclipse中maven项目有一个红叉
- 树和森林的孩子兄弟结构
- C# 关于判断字符串为空的一些方法
- unity3d 使用LitJson解析 JSON格式数据
- apache下ssi的支持
- mmap详解