蓄水池抽样

 之前也有写过从随机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)
}'

 

 

 

 

 

posted @ 2013-07-19 16:38  liyuxia713  阅读(364)  评论(0编辑  收藏  举报