每天一道算法练习题--Day25 第一章 --算法专题 --- ----------蓄水池抽样

news2025/1/13 6:23:39

蓄水池抽样

  • 问题描述
  • 算法描述
  • 相关题目
  • 总结

力扣中关于蓄水池抽样问题官方标签是 2 道,根据我的做题情况来看,可能有三四道。比重算是比较低的,大家可以根据自己的实际情况选择性掌握。

蓄水池抽样的算法思维很巧妙,代码简单且容易理解,就算不掌握它,作为了解也是很不错的。

问题描述

给出一个数据流,我们需要在此数据流中随机选取 k 个数。由于这个数据流的长度很大,因此需要边遍历边处理,而不能将其一次性全部加载到内存。

请写出一个随机选择算法,使得数据流中所有数据被等概率选中。

这种问题的表达形式有很多。比如让你随机从一个矩形中抽取 k 个点,随机从一个单词列表中抽取 k 个单词等等,要求你等概率随机抽取。不管描述怎么变,其本质上都是一样的。今天我们就来看看如何做这种题。

算法描述

这个算法叫蓄水池抽样算法(reservoid sampling)。

其基本思路是:

  • 构建一个大小为 k 的数组,将数据流的前 k 个元素放入数组中。
  • 对数据流的前 k 个数先不进行任何处理。
  • 从数据流的第 k + 1 个数开始,在 [1, i] 之间选一个数 rand,其中 i 表示当前是第几个数。
  • 如果 rand 大于等于 k 什么都不做
  • 如果 rand 小于 k, 将 rand 和 i 交换,也就是说选择当前的数代替已经被选中的数(备胎)。
  • 最终返回幸存的备胎即可

这种算法的核心在于先以某一种概率选取数,并在后续过程以另一种概率换掉之前已经被选中的数。因此实际上每个数被最终选中的概率都是被选中的概率 * 不被替换的概率。

伪代码:

伪代码参考的某一本算法书,并略有修改。

Init : a reservoir with the size: k
for i= k+1 to N
    if(random(1, i) < k) {
        SWAP the Mth value and ith value
    }

这样可以保证被选择的数是等概率的吗?答案是肯定的。

  • 当 i <= k ,i 被选中的概率是 1。
  • 到第 k + 1 个数时,第 k + 1 个数被选中的概率(走进上面的 if 分支的概率)是 k k + 1 \frac{k}{k+1} k+1k,到第 k + 2 个数时,第 k + 2 个数被选中的概率(走进上面的 if 分支的概率)是 k k + 2 \frac{k}{k+2} k+2k,以此类推。那么第 n 个数被选中的概率就是 k n \frac{k}{n} nk
  • 上面分析了被选中的概率,接下来分析不被替换的概率。到第 k + 1 个数时,前 k 个数被替换的概率是 1 k \frac{1}{k} k1。到前 k + 2 个数时,第 k + 2 个数被替换的概率是 1 k \frac{1}{k} k1,以此类推。也就是说所有的被替换的概率都是 1 k \frac{1}{k} k1。知道了被替换的概率,那么不被替换的概率其实就是 1 - 被替换的概率。

因此对于前 k 个数,最终被选择的概率都是 1 * 不被 k + 1 替换的概率 * 不被 k + 2 替换的概率 * … 不被 n 替换的概率,即 1 * (1 - 被 k + 1 替换的概率) * (1 - 被 k + 2 替换的概率) * … (1 - 被 n 替换的概率),即 1 × ( 1 − k k + 1 × 1 k ) × ( 1 − k k + 2 × 1 k ) × . . . × ( 1 − k n × 1 k ) = k n 1 \times (1 - \frac{k}{k+1} \times \frac{1}{k}) \times (1 - \frac{k}{k+2} \times \frac{1}{k}) \times ... \times (1 - \frac{k}{n} \times \frac{1}{k}) = \frac{k}{n} 1×(1k+1k×k1)×(1k+2k×k1)×...×(1nk×k1)=nk

对于 第 i (i > k) 个数,最终被选择的概率是 第 i 步被选中的概率 * 不被第 i + 1 步替换的概率 * … * 不被第 n 步被替换的概率, 即 k k + 1 × ( 1 − k k + 2 × 1 k ) × . . . × ( 1 − k n × 1 k ) = k n \frac{k}{k+1} \times (1 - \frac{k}{k+2} \times \frac{1}{k}) \times ... \times (1 - \frac{k}{n} \times \frac{1}{k}) = \frac{k}{n} k+1k×(1k+2k×k1)×...×(1nk×k1)=nk

总之,不管是哪个数,被选中的概率都是 k n \frac{k}{n} nk,满足概率相等的需求。

相关题目

在这里插入图片描述

总结

蓄水池抽样算法核心代码非常简单。但是却不容易想到,尤其是之前没见过的情况下。其核心点在于每个数被最终选中的概率都是被选中的概率 * 不被替换的概率。于是我们可以采取某一种动态手段,使得每一轮都有概率选中和替换一些数字。 上面我们有给出了概率相等的证明过程,大家不妨自己尝试证明一下。之后结合文末的相关题目练习一下,效果会更好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TFT屏幕在arduino (esp 32)下的驱动,汉字显示和字库比较

一、TFT屏幕的驱动列表支持 绝大多数的tft屏幕在esp32 下都可以被 TFT_eSPI 驱动显示&#xff0c;以下清单中的驱动模块都可以用tft_espi来显示&#xff1a; // #define ILI9341_DRIVER // Generic driver for common displays //#define ILI9341_2_DRIVER // Alter…

借助国内ChatGPT平替+MindShow,飞速制作PPT

系列文章目录 后续补充 文章目录 系列文章目录前言一、科大讯飞“星火”认知大模型介绍二、使用步骤1.借助讯飞星火生成ppt的文案2.借助MindShow生成ppt 前言 随着人工智能技术的不断发展&#xff0c;越来越多的企业和个人开始利用自然语言处理技术来提高工作效率。其中&#…

【移动端网页布局】flex 弹性布局 ⑥ ( 设置主轴方向和是否自动换行 | flex-flow 样式说明 | 代码示例 )

文章目录 一、设置主轴方向和是否自动换行 : flex-flow 样式说明1、flex-flow 样式2、flex-flow 样式属性值 二、代码示例 一、设置主轴方向和是否自动换行 : flex-flow 样式说明 1、flex-flow 样式 flex-flow 样式 是 flex-direction 属性和 flex-wrap 属性的 复合写法 ; 设置…

Redis底层结构

https://mp.weixin.qq.com/s/MGcOl1kGuKdA7om0Ahz5IA 小林coding 介绍 Redis 数据结构并不是指 tring&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Hash&#xff08;哈希&#xff09;、Set&#xff08;集合&#xff09;和 Zset&#xff08;有序集合&am…

日撸 Java 三百行day43-44

文章目录 说明day43 插入排序思路代码 day44 希尔排序思路代码 对比 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledat…

磁盘空间不足怎么办?释放磁盘空间的4种方法

虽然现在硬盘的空间越来越大&#xff0c;但是在这个数据爆炸的时代中&#xff0c;总是会觉得存储空间不够用&#xff0c;一不注意磁盘就满了&#xff0c;那么除了清空回收站、卸载某些程序外&#xff0c;还能怎么释放磁盘空间呢&#xff1f; 方案一&#xff1a;禁用休眠 休眠是…

KD305Y带吸收比极化指数兆欧表

一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如&#xff1a;电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验&#xff0c;首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加&#xff0c;用普通的兆欧表无…

Springboot +Flowable,服务任务ServiceTask执行的三种方式(二)

一.简介 ServiceTask 从名字上看就是服务任务&#xff0c;它的图标是像下面这样&#xff0c;截图如下&#xff1a; ServiceTask 一般由系统自动完成&#xff0c;当流程走到这一步的时候&#xff0c;不会自动停下来&#xff0c;而是会去执行我们提前在 ServiceTask 中配置好的…

ubuntu下用VirtualBox安装Windows虚拟机

1.准备工作 从清华大学信息门户——公共服务及其他——软件资源——公共软件——操作系统——Windows11处下载对应的ios系统安装软件 注意下载后将文件名中的 “ .IOS ” 大写改为 “ .ios ” 小写&#xff0c;否则后续虚拟机无法直接识别 问题提示&#xff1a; 解决iso文件不…

【unity造轮子】2d敌人AI的实现,并自动躲避障碍物

最终效果 插件链接: https://download.csdn.net/download/qq_36303853/87762376 导入AI插件 新建空物体,添加PathFinder组件,用在地图导航 渲染导航路径,绘制出来的蓝色部分则为可行走区域,非蓝色区域是我配置的碰撞器区域,可自行修改,如果不满意可以修改Diameter的…

Aztec Hybrid Rollup:混合zkRollup,而非zkEVM

1. 引言 Aztec zkRollup为混合zkRollup&#xff1a; 支持通用私有计算的加密zkRollup&#xff08;命名为Aztec&#xff09;&#xff1a;构建trustless、可扩展的、去中心化的Layer2 zkRollup&#xff0c;同时支持private smart contract execution。同时支持public state和pr…

云原生介绍

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130540430 一、云原生的概念 云原生的整体概念思路是三统一&#xff0c;即统一基础平台、统一软件架构、统一开发流程。 基于统一的基础平台、软件架构以及开发流程&#xff0c;数字化转型和云化转型能…

04- 评价指标mAP (目标检测)

要点&#xff1a; Precision (准确率 )&#xff1a;TP/(TPFP)&#xff0c;即模型给出的所有预测结果中命中真实目标的比例。Recall (召回率)&#xff1a;TP/(TPFN)&#xff0c;被找到的正确目标和所有正确目标的比值。 官方文档&#xff1a;https://cocodataset.org/#detectio…

用Python批量生成word文档

楼主有个同事妹子每天都做重复性工作而且加班到很晚。这是楼主出于兴趣帮她写的的批量生成保密协议word文档的脚本&#xff0c;共享给大家使用~1小时的工作&#xff0c;用脚本5秒钟即搞定有木有~ copy到本地存成.py文件即可使用&#xff0c;生成的文件是这样的&#xff1a; #创…

MySQL基础(十一)数据处理之增删改

1. 插入数据 1.1 实际问题 解决方式&#xff1a;使用 INSERT 语句向表中插入数据。 1.2 方式1&#xff1a;VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 情况1&#xff1a;为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....)…

文旅数字人出圈不断,文旅数字人宣传片制作赋能数字文旅新业态

在文旅产业发展中 数字人的应用越来越广泛 文旅借助数字人浪潮 把传统文化与科技相融合 以Z世代年轻群体所喜爱的方式 推动文旅数字化发展 文旅数字人应用场景——数字人文旅宣传片 可以让数字人作为文旅宣传片主角&#xff0c;串联当地代表性的历史文化地标、现代都市场景…

webconsole使用方法(fastapi框架)

webconsole使用方法 项目背景docker实现linux实现 安装webconsole包代码中需要改动的地方引用路由加入路由到访问路径 示例接口访问路径 项目背景 需要在自己的项目中&#xff0c;可以实时连接linux或者docker的命令行&#xff0c;以此来达到webconsole或者叫web terminal的这…

开源智慧家居

与家居行业、服务行业等伙伴协同合作&#xff0c;努力创造社会价值&#xff0c;提升行业整体服务 水平&#xff0c;树立家居服务业统一售后标准&#xff0c;构建品质、高效、有温度的居家生活服务新生态。 为企业商家和个人客户提供家居配送、搬运、安装、维修、保养等服务。 …

在Linux系统中搭建Docker环境

搭建Docker环境 文章目录 搭建Docker环境Ubuntu版本安装DockerCentos版本安装Docker配置镜像加速 Ubuntu版本安装Docker 按照以下步骤在 Ubuntu 上安装 Docker&#xff1a; 卸载旧版本的 Docker&#xff08;如果有&#xff09;&#xff1a; sudo apt-get remove docker docker…

【PYTHON】绘制热力图SEABORN.HEATMAP

目录 一、参数详解二、颜色参数-cmap三、个性化设置四、代码 更多python资料、源码、教程皆可点击文章下方名片获取此处跳转 一、参数详解 seaborn.heatmap&#xff08;&#xff09; seaborn.heatmap(data, vminNone, vmaxNone, cmapNone, centerNone, robustFalse, annotNon…