Reservoir Sampling 蓄水池抽样

最先遇到这个问题是在面试题


原始版
有一个店老板, 他决定从每天光顾他的店的顾客中随机选出一个人, 在当天打烊时给这位顾客发去一份小礼品, 问怎样选才能保证随机 ( 顾客不是同时来, 所以没法让这一堆人站好随机挑, 而且每天会来多少人你不知道, 可能打烊前突然来一大拨人, 老板比较呆, 只能记住一两个人, 没法把所有人的信息都记录下来)

抽象版
有一个数据流输入过来, 请在数据流停止时, 返回数据流中的随机的一个数. 注意, 数据是流, 只能一次读, 而且数据流很大, 本机无法完整存储 (最多也就很少几条)

实际应用
从每天的日志中, 对符合条件的日志, 随机抽出一条来做校验, 数据太大只能一次读过去, 要保证是随机的

加强版
如果店老板每天不是送一个人礼品, 而是送 k 个人礼品, 怎么办?

加强版的抽象
从数据流中返回随机的 k 个数

加强版的实际应用
从每天的日志中随机挑出 k 条来做校验


解放办法参考如下:

http://www.yewen.us/blog/2011/10/random-select-problem/

http://www.dewen.org/q/10964

http://handspeaker.iteye.com/blog/1167092

http://hi.baidu.com/cpuramdisk/item/260611ca0082bcd796445239

你可能感兴趣的:(数据结构,随机抽样,蓄水池抽样,面试题)