猫和桃子去吃回转寿司。桃子让猫从转盘上随机取下k个碟子。猫应该怎么做?
已知:
1、猫和桃子坐在最上游的位置,从厨房伸出来的传送带会在第一时间把厨师做好的寿司送到他们面前。
2、从猫眼前经过的寿司如果不被猫取下来,则会被坐在下家的兔子们吃光,而不会再转回来。(每个寿司只经过一次)
3、桌子上只能容纳下k个碟子。
4、如果取下的寿司没有被吃过,可以被重新放回去。
5、虽然厨师已经停止生产新的寿司了,但是传送带在厨房里的部分很长,猫不知道已经生产了多少寿司。(为了讨论方便,设一共N碟寿司,并且N≥k)
6、猫脑袋可以生成随机数。
Ok,以上表述纯粹是好玩。实际上是做这样一件事情:
从包含N个项目的集合S中随机选取k个样本,其中N为一很大、未知的数量,以至于不能把所有N个项目都存放到主内存。要求只对N遍历一次。
Jeffrey Scott Vitter在其论文[1]中提出了该问题并给出了一个精妙的算法:
1、把桌子清空,留出编号为1~k的k个位置存放寿司。
2、把前k个(第1~k个)寿司分别放在1~k号位置。
3、当第j个寿司经过面前时(k+1≤j≤N),猫脑袋生成一个1~j之间的随机整数r。
4、若r≤k,则把桌子上r号位置的寿司替换为当前(第j个)寿司;否则不操作。
5、如此(3、4步骤)直至所有寿司在猫面前经过。
这个算法的规范描述及其证明[2][3]并不复杂。我们可以计算传送带上第i个寿司最终被选取的概率P(i),说明P(i)=k/N,从而证明该算法:
如果i≤k,则一开始它就被放在了桌子上,对它产生“威胁”的寿司是第k+1~N个寿司。第j(k+1≤j≤N)个寿司把它替换掉的概率为1/j,即“安全”的概率为(j-1)/j。由概率基本常识我们知道:P(i)=[k/(k+1)]×[(k+1)/(k+2)]×...×[(N-1)/N]=k/N。
对于i>k的情形,有兴趣的读者可以自己完成这部分证明。
这个算法的精妙之处在于它的时间复杂度是O(N),空间复杂度是O(k)。
果壳网[4]上给出了这个问题的一个没有太大意义的答案,有兴趣的读者可以去看看。
相关推荐
这个项目的核心是实现Reservoir Sampling算法,这是一种在大数据集上进行无偏随机抽样的算法,尤其适用于内存限制的环境。下面我们将深入探讨Reservoir Sampling算法、其原理以及在命令行中的应用。 Reservoir ...
本文将深入探讨Clojure中实现随机抽样的方法,主要关注Reservoir Sampling和Stream Sampling两种策略。 首先,让我们了解什么是随机抽样。随机抽样是指在不破坏总体分布的前提下,从一个较大的数据集中抽取一部分...
本文探讨了在数据集大小未知的情况下进行随机抽样的问题,并提出了一种高效的方法——水库抽样算法(Reservoir Sampling Algorithm)。该算法能够在一次遍历过程中,利用常数空间复杂度选取一个不放回的随机样本,...
Android Reservoir是一个轻量级的库,专门为Android应用设计,用于高效、安全地存储和检索本地数据。这个库简化了应用程序在本地持久化数据的过程,无论是小规模的数据,如偏好设置,还是中等规模的数据,如JSON对象...
Vitter的水库采样算法(Reservoir Sampling)是一种在大数据集上进行随机抽样的高效算法,由Jeffrey Scott Vitter于1985年提出。这个算法在处理大数据流时特别有用,因为它允许在固定内存空间内对任意大小的数据流...
根据提供的信息,《Reservoir Engineering Handbook》是一本关于储层工程的专业书籍,主要涵盖了与石油、天然气等储层相关的基础知识及流体性质等内容。下面将基于标题、描述以及部分章节内容来详细阐述本书涉及的...
例如,在大数据集上进行随机选择时,一次性加载所有数据可能不切实际,这时就需要采用更高效的策略,如 reservoir sampling 或者使用伪随机数序列。 Reservoir Sampling 是一种在未知大小的数据流中进行随机采样的...
这是一个关于双重介质试井的小程序。welltest是主程序,其他是子程序。fun和fun1分别是压力计算函数和压力导数计算函数。计算过程中可以改变不同参数的取值,绘制图形,研究各参数对压力响应的敏感性。...
数据挖掘是指从大量数据中自动搜索隐藏在其中的具有特殊关系性的信息的过程,它利用了抽样、估计、假设验证、人工智能、建模技术、信息检索等方面的思想。数据挖掘技术在商务管理、市场分析、工程设计等多个领域中...
Reservoir connectivity evaluation based on the reservoir architecture,尹太举,张昌民,Reservoir connection is a key factor for water flooding recovery. Ways for connection evaluation is though well ...
### 帝国理工大学课程资料:储层工程模拟机会 #### 概述 帝国理工大学地球科学与工程系的这份课程资料介绍了储层工程模拟的相关机会。该课程由J-P. Latham、J. Xiang和X....课程资料主要探讨了虚拟地质工作台(VGW)在...
#### 标题:地统计储层建模(Geostatistical Reservoir Modeling) **地统计储层建模**是石油地质领域中的一个重要分支,它通过数学方法和统计技术来研究地下油气藏的空间分布特征。这种建模方法在石油勘探与开发...
Reservoir Sampling是一种在线抽样算法,能够在不加载整个文件到内存的情况下实现均匀随机抽样,对于处理无法一次性加载到内存的大文件非常有效。 ### 4. **联接** (Joining) 数据联接是数据分析中的重要操作,tsv-...
libraryDependencies += "lgbt.princess" %% "reservoir-core" % "0.4.0" // the core library supporting synchronous reservoir sampling libraryDependencies += "lgbt.princess" %% "reservoir-akka-stream" % ...
reservoir array for i := 1 to k R[i] := S[i] # replace elements with gradually decreasing probability for i := k+1 to n # randomInteger(a, b) generates a uniform integer from the inclusive range {a, ....
很基础的一本油藏数值模拟教材,感兴趣的可以好好看看
忆阻器的特性使其适合作为实现储层计算(Reservoir Computing, RC)系统的基础。然而,忆阻器系统的计算能力受到系统架构、忆阻器物理特性的交织影响,这使得确定性能关键因素变得复杂。 文章介绍了一个基于忆阻器...
Application of FPGA to Real‐Time Machine Learning Hardware Reservoir Computers and Software Image Processing 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国...
os-fast-reservoir 快速近似水库采样的Python实现。 安装 $ pip install os-fast-reservoir 用法 原料药 from os_fast_reservoir import ReservoirSampling rs = ReservoirSampling(100) for i in range(1000):...