当前位置: 首页 > news >正文

水塘抽样算法

水塘抽样算法

1、问题描述

最近经常能看到面经中出现在大数据流中的随机抽样问题

即:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。

假设数据流含有N个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应该为 1/N

那如何保证呢?

2、解题思路

先说方案:

每次只保留一个数,当遇到第 i 个数时,以 1/i的概率保留它,(i-1)/i的概率保留原来的数。

举例说明: 1 - 10

  • 遇到1,概率为1,保留第一个数。
  • 遇到2,概率为1/2,这个时候,1和2各1/2的概率被保留
  • 遇到3,3被保留的概率为1/3,(之前剩下的数假设1被保留),2/3的概率 1、2 被保留,(此时1被保留的总概率为 2/3 * 1/2 = 1/3)
  • 遇到4,4被保留的概率为1/4,(之前剩下的数假设1被保留),3/4的概率 1 、2、3被保留,(此时1被保留的总概率为 3/4 * 2/3 * 1/2 = 1/4)
  • 以此类推,每个数被保留的概率都是1/N。

3、示例

382. 链表随机节点

import random
class Solution:def __init__(self, head: ListNode):self.head = headdef getRandom(self) -> int:count = 0reserve = 0cur = self.headwhile cur:count += 1rand = random.randint(1,count)if rand == count:reserve = cur.valcur = cur.nextreturn reserve

参考资料
https://leetcode.cn/problems/linked-list-random-node/solutions/135440/xu-shui-chi-chou-yang-suan-fa-by-jackwener/

http://www.lryc.cn/news/285730.html

相关文章:

  • easyui渲染隐藏域<input type=“hidden“ />为textbox可作为分割条使用
  • 100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战
  • Go七天实现RPC
  • Elasticsearch:和 LIamaIndex 的集成
  • QT基础篇(14)QT操作office实例
  • 重拾计网-第四弹 计算机网络性能指标
  • 【Vue】Vue 路由的配置及使用
  • 网络安全事件分级指南
  • uniapp组件库SwipeAction 滑动操作 使用方法
  • YARN节点故障的容错方案
  • C++后端笔记
  • JavaEE中什么是Web容器?
  • MySQL 8.0 架构 之错误日志文件(Error Log)(1)
  • 51单片机实验课一
  • 【.NET Core】多线程之线程池(ThreadPool)详解(一)
  • 圆的参数方程是如何推导的?
  • sqlmap使用教程(2)-连接目标
  • c++ http第一个服务
  • 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程
  • 【cucumber】cluecumber-report-plugin生成测试报告
  • 华为欧拉操作系统结合内网穿透实现固定公网地址SSH远程连接
  • 加速 Selenium 测试执行最佳实践
  • c语言野指针
  • 【MySQL】where和having的区别
  • npm pnpm yarn 报错或常见问题处理集锦
  • 【Git】常用的Git操作集合
  • JavaScript库jquery的使用方法
  • Vue (v-bind指令、el与data的两种写法、理解MVVM、数据代理、V-no事件处理、双向数据绑定V-model、登陆页面实现
  • SpringBoot - SpringBoot手写模拟SpringBoot启动过程
  • 40. 组合总和 II - 力扣(LeetCode)