谷歌笔试题:如何随机选取1000个关键字
http://www.cnblogs.com/jack204/archive/2012/09/21/2696812.html
给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字?
定义长度为1000的数组。
对于数据流中的前1000个关键字,显然都要放到数组中。
对于数据流中的的第n(n>1000)个关键字,我们知道这个关键字被随机选中的概率为 1000/n。所以我们以 1000/n 的概率用这个关键字去替换数组中的随机一个。
因为此时对于第n个关键字,它被选中的概率为:1000/n=p. 而对于前面n-1个关键字来说,可以分成2步:
- 第一步,先在n-1个关键字中,被选q=1000/n-1的概率选为n-1中的1000个。
- 第二步,在这1000个与第n个中选择1000个数字。
所以前n-1个被选中的概率为:1000/n-1 * [999/1000 * 1000/n + (1-1000/n)] = 1000/n.
综上所述 这样就可以保证所有关键字都以 1000/n的概率被选中。
对于后面的关键字都进行这样的处理,这样我们就可以保证数组中总是保存着1000个随机关键字。
证明:
使用归纳法证明