谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 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 个 随机关键字。
对于后面的关键字都进行这样的处理,这样我们就可以保证数组中总是保存着 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个关键字(蓄水池抽样)
- 33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
- 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从 这个输入 流中随机取得 m 个记录。
- 谷歌面试题:从无穷尽的流中随机的选取1000个关键字(蓄水池抽样)
- Java面试题:1-100之间的数,被放在数组a[99]中,有一个数没有包含在其中,用java代码找出这个数
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- 面试题:给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的
- 给定一个未知长度的整数流,如何随机选取一个数?
- 谷歌笔试题:如何随机选取1000个关键字
- 面试题 单向链表(无头结点)一个指针指向其中的一个结点,如何删除这个结点?
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 网易面试题之 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,
- 面试题:给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么元素的存储的角标位如何获取。
- Java面试题:1-100之间的数,被放在数组a[99]中,有一个数没有包含在其中,用java代码找出这个数
- 02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 网易面试题之 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 网易面试题之 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,