[Algorithm] Reservoir Sampling
Given a stream of elements too large to store in memory, pick a random element from the stream with uniform probability.
To solve the problem which n size is unknown, Reservior Sampling is a perfect algorithm to use:
Reservoir sampling algorithm can be used for randomly choosing a sample from a stream of n items, where n is unknow.
Here we still need to prove that
Consider the (i)th item, with its compatibility probability of 1/i. The probability I will be choose the i at the time n > i can be demonstrated by a simple formula
i/i: Probability the ith item will be selected;
(1 - i/i+1): Probability the i+1th item will NOT be selected;
(1 - i/i+2): Probability the i+2th item will NOT be selected;
(1 - 1 / n): Probability the nth item will NOT be selected;
In the end, the probability of ith item will be selected at given n, which n > i is 1/n.
Let’s attempt to solve using loop invariants. On the ith iteration of our loop to pick a random element, let’s assume we already picked an element uniformly from [0, i - 1]. In order to maintain the loop invariant, we would need to pick the ith element as the new random element at 1 / (i + 1) chance. For the base case where i = 0, let’s say the random element is the first one.
function Reservoir_Sampling (ary) { let selected; const size = ary.length; for (let i = 0; i < size; i++) { if (Math.floor(Math.random() * size) === 1) { selected = ary[i]; break; } } return selected; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2017-03-20 [Angular] Reactive Form -- FormControl & formControlName, FormGroup, formGroup & formGroupName
2016-03-20 [Angular 2] Using the @Inject decorator
2016-03-20 [WebStrom] Cannot detect file change to trigger webpack re-compile
2016-03-20 [TypeScript] Avoid any type
2016-03-20 [Angular 2] Injecting a Service
2016-03-20 [Angular 2] Event in deep
2015-03-20 [Javascript] Get Started with LeafletJS Mapping