问题:
i=0
s=null
for line in 文本文件
i=i+1
r=[0,1)//以1/i的概率将s替换成第i行
if r<1/i
s=line
数学原理
复杂度分析:
时间复杂度:o(N)
空间复杂度:o(1)
如果文本中选择N行呢?
i=0
s=[]
for line in 文本文件:
i=i+1
if i<=k//如果小于k行,直接选取
s.append(line)
else:
r=[0,1)
if r<k/i://当i>k,以k/i的概率选择第i行,并且从s[1...k]随机选择一个元素,将它替换成第i行
j=[1,k]
s[j]=line
代码优化
i=0
s=[]
for line in 文本文件:
i=i+1
if i<=k//如果小于k行,直接选取
s.append(line)
else:
j= [1,i]//选中第一行到第i行
if j<=k://如果小于k,把s的第j个替换成当前行的文本
s[j]=line;