什么是蓄水池抽样,它能解决什么问题?html
百度面试以算法为主啊,手动写代码。第一道题是实现c语言库函数strcpy,这个原理很简单,但要注意如下这几点:java
第二道题是写一个java类,实现堆的操做。说实话,虽然堆的操做不难,但要真正实现它并不容易。如下须要注意的点:python
重点是第三道题目:给定一个文件,从中随机取出n行,并计算时间复杂度。我上来即是这样的代码:面试
import random def sample(filename, n = 3): assert(filename is not None) result = [] with open(filename) as f: lines = f.readlines() while len(result) < n : line = random.choice(lines) if line not in result: result.append(line.strip()) return result
这种方法算法
后来面试官问我知不知道分治法,我说了解,但这有关系么?编程
蓄水池抽样(Reservoir Sampling )是一个颇有趣的问题,它可以在o(n)时间内对n个数据进行等几率随机抽取,
例如:从1000个数据中等几率随机抽取出100个。另外,若是数据集合的量特别大或者还在增加(至关于未知数据集合总量),
该算法依然能够等几率抽样。数组
以上摘自handspeaker博客app
算法步骤为:dom
利用概括法能够证实每行被取的几率是相等的,证实过程
见handspeaker博客函数
问题解决了,毫无悬念!
import random def sample(filename, n = 5): assert(filename is not None) result = [] with open(filename, mode = "r") as f: for i in range(n): line = f.readline() if line == '': return result else: result.append(line.strip()) i = n for line in f: k = random.randint(0, i) if k < n: result[k] = line.strip() i += 1 return result