水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况。最常见例子为Jeffrey Vitter在其论中所提及的算法R。
参照Dictionaryof Algorithms and Data Structures所载的O(n)算法,包含以下步骤(假设阵列S以0开始标示):
从S中抽取首k项放入「水塘」中对于每一个S[j]项(j ≥ k):
随机产生一个范围从0到j的整数r
若 r < k 则把水塘中的第r项换成S[j]项