蓄水池抽样算法
蓄水池抽样,也称水塘抽样,是随机抽样算法的一种。
基本抽样问题
有一批数据(假设为一个数组,可以逐个读取),要从中随机抽取一个数字,求抽得的数字下标。
常规的抽样方法是,先读取所有的数字,记录数字的总个数,记为n。然后产生一个0 ~ n - 1范围内的随机数即可,即随机抽取的数字下标index为:

其中,rand为随机数产生函数。
但是上述常规抽样方法,有一个局限性就是,必须读取完所有的数字之后才可以计算下标。
一方面,如果数据量很大,一次性读入所有的数据,需要很大的内存。另外一方面,很多流式数据,往往都是不断在读取数据,如果要读完所有的数据,还需要额外记录度过的数据。
那么,能不能边读数据边计算,并且度过的数据不要记录了呢?
蓄水池抽样基本算法
这里就要用到今天要讲的蓄水池抽样算法,用index记录最终得到随机数下标,该算法简述如下:
从前往后不断读取数字,读到第i(从0开始)个数字时,在[0, i]范围内产生一个随机数r,如果r = 0,那么index = i,否则index维持原来的的值,那么最终index就是产生的随机数的下标。
下面来证明这个算法的正确性,证明算法的正确性,即使要证明每个数字抽到的概率相等。假设数字的中个数为n,那么这些数字的下标为0 ~ n - 1,设抽到下标为i的数字的概率为P(i),根据上面的描述,要抽到下标为i的数字,要满足的条件为:
在读到第i个数字时,[0, i]范围内产生的随机数为0,这样index = i
在读到第i个数字之后的数字时,不能再产生随机数0(否则index就为k了)


从上面的计算可以看到,每个数字抽到的概率为1/n,因此该抽样的方法是正确的。
很多人有一点疑惑,通过上面的方法,一定会抽到某个数字吗?
答案是肯定的,因为在读到第0个数字时,从[0,0]中产生一个随机数,肯定是0。因此,下标为0的梳子一开始肯定会被选中,如果后续没有其它数字选中的话,就是下标为0的数字了,从而保证一定有一个数字被选中。
蓄水池抽样算法的变式
假如并不是从所有的数字中抽取,而是从满足某些条件的数字中抽取。假如这些数字中有多个数字x,要从所有的数字x中抽出一个数字,求最后抽得的数字x的下标。
只需要将上面方法中的i换成x的计数就好:
从前往后不断读取数字,读到第k个数字时,若该数字为x,设为第i个x,在[0, i]范围内产生一个随机数r,如果r = 0,那么index = k,否则index维持原来的的值,那么最终index就是产生的随机数的下标。
相关文章:
蓄水池抽样算法
蓄水池抽样,也称水塘抽样,是随机抽样算法的一种。基本抽样问题有一批数据(假设为一个数组,可以逐个读取),要从中随机抽取一个数字,求抽得的数字下标。常规的抽样方法是,先读取所有的…...
数据结构预算法之买股票最好时机动态规划(可买卖多次)
一.题目二.思路在动规五部曲中,这个区别主要是体现在递推公式上,其他都和上一篇文章思路是一样的。所以我们重点讲一讲递推公式。这里重申一下dp数组的含义:dp[i][0] 表示第i天持有股票所得现金。dp[i][1] 表示第i天不持有股票所得最多现金如…...
华为OD机试真题Java实现【蛇形矩阵】真题+解题思路+代码(20222023)
蛇形矩阵 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 例如,当输入5时,应该输出的三角形为: 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11请注意本题含有多组样例输入。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Java)真题目录汇总 输入描述:…...
spring Bean的生命周期 IOC
文章目录 1. 基础知识1.1 什么是 IoC ?2. 扩展方法3. 源码入口1. 基础知识 1.1 什么是 IoC ? IoC,控制反转,想必大家都知道,所谓的控制反转,就是把 new 对象的权利交给容器,所有的对象都被容器控制,这就叫所谓的控制反转。 IoC 很好地体现了面向对象设计法则之一 —…...
详解cors跨域
文章目录同源策略cors基本概念cors跨域方式简单请求 simple request非简单请求- 预检请求CORS兼容情况CORS总结同源策略 在以前的一篇博客中有介绍,同源策略是一种安全机制,为了预防某些恶意的行为,限制浏览器从不同源文档和脚本进行交互的行…...
ARM uboot 源码分析7 - uboot的命令体系
一、uboot 命令体系基础 1、使用 uboot 命令 (1) uboot 启动后进入命令行环境下,在此输入命令按回车结束,uboot 会收取这个命令然后解析,然后执行。 2、uboot 命令体系实现代码在哪里 (1) uboot 命令体系的实现代码在 uboot/common/cmd_xx…...
物理服务器与云服务器备份相同吗?
自从云计算兴起以来,服务器备份已经从两阶段的模拟操作演变为由云服务器备份软件执行的复杂的多个过程。但是支持物理服务器和虚拟服务器之间的备份相同吗?主要区别是什么?我们接下来将详细讨论这个问题。 物理服务器与云服务器备份的区别 如果您不熟悉虚拟服务器…...
【Linux】system V共享内存 | 消息队列 | 信号量
🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉system V共…...
FSC的宣传许可 答疑
【FSC的宣传许可 答疑】问:已经采购了认证产品但没有贴FSC标签,是否可以申请宣传许可?答:不可以。要宣传您采用了FSC认证产品的前提条件之一是产品必须是认证且贴有标签的。如果产品没有贴标,则不可申请宣传许可。您的…...
Leetcode力扣秋招刷题路-0100
从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 100. 相同的树 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是…...
协作对象死锁及其解决方案
协作对象死锁及其解决方案 1.前言 在遇到转账等的需要保证线程安全的情况时,我们通常会使用加锁的方式来保证线程安全,但如果无法合理的使用锁,很可能导致死锁。或者有时我们使用线程池来进行资源的使用,如调用数据库࿰…...
良许也成为砖家啦~
大家好,我是良许。 没错,良许成为砖家啦,绝不是口嗨,有图有真相! 有人会说,咦,这明明是严宇啊,跟你良许有啥关系? 额。。老读者应该知道良许的来历—— 鄙人真名严宇&a…...
Java中的编程细节
前言: 学习过程中有不少时候遇到一些看似简单,做起来事倍功半的问题。我也想自己是个聪明人,学东西一听就懂,一学就会,马上就能灵活应用。但这种事不能强求,要么自己要看个十遍二十遍最后理清逻辑…...
Yolov8从pytorch到caffe (一) 环境搭建
Yolov8从pytorch到caffe (一) 环境搭建 1. 创建虚拟环境2. 安装pytorch与v8相关库3. 测试安装是否成功4. 测试推理图像在windows上配置YOLOv8的环境,训练自己的数据集并转换到caffemodel1. 创建虚拟环境 利用conda创建虚拟环境 conda create -n yolo python=3.8 -y 并进入ac…...
2023年CDGA考试-第16章-数据管理组织与角色期望(含答案)
2023年CDGA考试-第16章-数据管理组织与角色期望(含答案) 单选题 1.在定义任何新组织或尝试改进现有组织之前了解当前组织的哪些方面非常重要? A.企业文化、运营模式和人员 B.业务战略、技术战略、数据战略 C.工具、方法和流程 D.事业环境因素、组织过程资产,行动路线图 …...
Stream——集合数据按照某一字段排序
文章目录前言假设业务场景排序前的准备正序排序1、数据集合的判空 Optional.isPresent()2、使用sort排序3、将排序后的数据流转换为list你以为这样就完了?倒序排序前言 之前,针对Stream链式编程中的几个方法做了大致的说明。详情可以参考: J…...
ubuntu:20.04编译arrow
1)拉取代码 git clone https://github.com/apache/arrow.git 2)切换分支 git checkout apache-arrow-11.0.0 3)拉入测试数据并设置环境变量 pushd arrow git submodule update --init export PARQUET_TEST_DATA"${PWD}/cpp/submodules/parquet-testing/da…...
2023如果纯做业务测试的话,在测试行业有出路吗?
直接抛出我的结论:手工做业务类测试,没有前途。 个人建议赶紧从业务测试跳出来,立即学习代码,走自动化测试方向。目前趋势,业务测试需要用自动化做。 为了让大家能够信服我的观点,本文将从以下方面进行阐…...
golang grpc ssl
无CA场景 在不考虑CA的场景下呢,client有client.key和client.crt,server有server.key和server.crt,生成方式可以如下: $ openssl genrsa -out server.key 2048 $ openssl req -new -x509 -days 3650 \-subj "/CGB/LChina/Og…...
华为服务器驱动下载及安装
1.服务器技术支持网站 https://support.xfusion.com/support/#/zh/home 2.选择软件下载 3.选择服务器型号 4.选择驱动 5.根据需求选择驱动 例如红帽7.4系统 6.安装驱动 自动安装驱动步骤: 1)使用BMC虚拟光驱挂载onboard_driver_xxx.iso: 2)mount /dev/sr0 /mnt …...
【.NET新特性·第2篇】C# 12 全特性回顾:语法糖的盛宴
C# 12 带来了主构造函数、集合表达式、Inline Arrays 等 8 个新特性,让代码更简洁 版本定位 适用版本:.NET 8 | C# 12 前置知识:C# 11 基础语法 背景 C# 11 引入了原始字符串字面量、list patterns 等特性,但开发者们期待更多语法…...
Creality Print:从新手到专家的完整3D打印切片软件指南
Creality Print:从新手到专家的完整3D打印切片软件指南 【免费下载链接】CrealityPrint 项目地址: https://gitcode.com/gh_mirrors/cr/CrealityPrint 在3D打印的世界里,切片软件是连接数字模型与物理实体的关键桥梁。无论您刚刚接触3D打印&…...
(良心整理)亲测靠谱的AI论文平台,毕业生收藏备用
毕业季论文写起来是不是总感觉难上加难?选题纠结、资料找不全、写作卡壳、查重压力大、格式总是不对…… 这份亲测有效的AI论文工具合集,帮你一键解决写作难题,涵盖中英文写作、全流程辅助、专项功能,免费和高性价比的都有&#x…...
SNK施努卡铜箔包装线:从拔轴到入库,全流程自动化怎么实现?
在锂电铜箔生产中,生箔机产出的铜箔卷需要经过裁切、拔轴、包装、入库等多个环节。传统方式下,拔轴依靠人力或简易机械,包装过程需要多人配合搬运、开箱、投干燥剂、合盖捆扎,不仅效率低,而且容易损伤铜箔边缘…...
10分钟快速上手:使用html-to-docx实现HTML到Word文档的无缝转换
10分钟快速上手:使用html-to-docx实现HTML到Word文档的无缝转换 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 还在为网页内容无法完美转换为Word文档而烦恼吗?每次复制粘贴H…...
Frida检测绕过本质:四大系统级锚点与工程化规避策略
1. 这不是“反检测”,而是对 Frida 运行机制的诚实理解很多人一看到“Frida 检测绕过”就本能地往“对抗”“隐藏”“伪装”上想,甚至直接去搜“frida hide”“frida stealth bypass”,结果踩进一堆过时、失效、逻辑错乱的 patch 坑里。我做过…...
Taotoken多模型聚合能力在内容生成场景中的灵活应用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken多模型聚合能力在内容生成场景中的灵活应用 对于新媒体运营和内容创作者而言,内容生成是核心工作之一。不同的…...
MultiHighlight插件:让代码阅读不再痛苦的终极解决方案
MultiHighlight插件:让代码阅读不再痛苦的终极解决方案 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors 🎨💡 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight 你是否…...
书匠策AI到底有多懂毕业生?一个论文小白的“开挂“实录,看完你也想试!
嗨,各位正在为毕业论文头秃的宝子们!👋 我是你们的论文科普搭子,今天不讲枯燥的写作技巧,直接给大家安利一个我最近发现的"宝藏神器"——书匠策AI( 官网直达:www.shujiangce.com&…...
Warcraft Helper:现代Windows环境下魔兽争霸3兼容性技术解决方案深度解析
Warcraft Helper:现代Windows环境下魔兽争霸3兼容性技术解决方案深度解析 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper Warcraft Helper…...
