什麼是蓄水池抽樣,它能解決什麼問題?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