为了明确以下是问题:
给定一个不确定长度的输入流,你如何返回该流的随机成员(每个成员的概率相等),因为你不允许存储超过恒定数量的输入,并且你只能通过输入一次
这个问题的解决方案似乎是 Reservoir Sampling,它在下面说明。“首先,你想创建一个包含 1,000 个元素的容器(数组),并用流中的前 1,000 个元素填充它。这样,如果你正好有 1,000 个元素,算法就可以工作。这是基本情况。
接下来,您要处理第 i 个元素(从 i = 1,001 开始),以便在处理该步骤结束时,您的水库中的 1,000 个元素在您迄今为止看到的 i 个元素中随机抽样。你怎么能做到这一点?从 i = 1,001 开始。在第 1001 步之后,元素 1,001(或与此相关的任何元素)应该在 1,000 个元素的集合中的概率是多少?答案很简单:1,000/1,001。”
我无法理解最后一句“答案很简单:1,000/1,001”。在 1001 个元素的数组中找到 1 个元素的概率不应该是 1/1001 而不是 1000/1001 吗?样本空间不等于 1001 且有利的结果数不等于 1 吗?