今天有幸听同事讲到蓄水池算法:
题目描述:在M个元素的队列中,随机选取k个元素,队列中每个元素的选取是等概率的;
证明过程:略 https://blog.csdn.net/alicelmx/article/details/95880727 (在这里转载的其他人的文章,如有侵犯请私聊)
使用方向:对数据进行等概率采样;该题目并不是为了证明这个算法,是利用这个算法进行采样;
根源分析:此算法类似于快照分析,即是对每一次分母(eg:M每次增加1)改变对概率进行改变。在贴出的文章中,每次k累计加上1步的时候,前k个数据的保留概率发生了改变;即k/k+m(m是增加的次数),这样也就构成了源源不断的改变;也就是分母发生改变,即下面所说等概率实现的 i 发生改变;
eg:比如一组不可知长度的数据,如果等概率的采样出N个数据;
关键点:
等概率:等概率的实现是基本的一种算法实现,后面进行实现说明;
替换:如果是不断的后面数据对结果影响,只能是后面的数据对已存的数据进行修改(替换)
等概率的实现:
r = rand(i) ; if(r < m) do sth
在这里解释一下:rand(i)等概率产生了0-i之间的数字r,每个数字出现的概率是1/i,则产生小于m的概率是m/r; 那么也就构成了概率性去做某事;