蓄水池抽样
之前也有写过从随机N条记录中选取M个随机记录的算法,但当时考虑的是N已知情形。(http://www.cnblogs.com/liyuxia713/archive/2012/05/25/2540709.html)
若N未知,该怎么办呢? 有个算法是 蓄水池抽样算法,reservoir sample。
什么情况下N未知呢? 比如记录个数特别多,在用集群处理的时候~
方法介绍参考:http://handspeaker.iteye.com/blog/1167092
下面是awk实现:
#!/bin/sh
awk -F '\t' '
BEGIN{
sample_num=100000
idx = 0;
}
{
idx=idx+1;
query = $1
if ( idx <= sample_num )
{
reservoir[idx] = query
}
else
{
rand_num = random_int(1,idx);
if ( rand_num < sample_num )
{
reservoir[rand_num] = query;
}
}
}
END{
for ( i=1; i <= sample_num; ++i )
{
print reservoir[i]
}
}
function random_int(min,max){
return int( rand()*(max-min+1) + min)
}'
转载请注明出处: http://www.cnblogs.com/liyuxia713/

浙公网安备 33010602011771号