您的位置:首页 > 职场人生

谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 1000 个关键字?

2013-07-16 11:35 1271 查看
定义长度为 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 个 随机关键字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 算法
相关文章推荐