新闻中心

C++怎么实现一个水塘抽样算法_C++大数据流随机抽样问题

2025-11-22
浏览次数:
返回列表
水塘抽样算法能从未知长度数据流中等概率抽取k个样本。初始化大小为k的数组存储前k个元素,第i个后续元素以k/i概率入池并随机替换旧元素,确保最终每个元素被选概率均为k/N。

c++怎么实现一个水塘抽样算法_c++大数据流随机抽样问题

水塘抽样(Reservoir Sampling)是一种用于从大量或未知长度的数据流中随机抽取样本的算法。特别适合处理无法一次性加载进内存的大数据流场景。C++实现时,核心是使用一个固定大小的“水塘”数组,并在遍历过程中动态维护样本的均匀性。

基本原理:如何保证等概率

假设要从数据流中随机选取 k 个元素,且每个元素被选中的概率相等。算法的关键在于:当读取到第 n 个元素时(n ≥ k),以 k/n 的概率决定是否将其放入水塘。若放入,则随机替换水塘中的一个已有元素。

这样能确保在整个流程结束后,每个元素出现在最终样本中的概率都是 k/N(N为总数量)。

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA

单样本水塘抽样(k=1)

适用于只需抽取一个元素的场景,空间复杂度 O(1),时间复杂度 O(n)。

遍历时,对第 i 个元素,以 1/i 的概率保留它作为当前结果。

#include <cstdlib>
#include <ctime>

int reservoirSamplingSingle() {
    int reservoir = 0;
    int i = 1;
    int num;

    srand(time(nullptr));

    while (std::cin >> num) { // 假设输入是数据流
        if (rand() % i == 0) {
            reservoir = num;
        }
        ++i;
    }

    return reservoir;
}

多样本水塘抽样(k > 1)

抽取 k 个不同元素,需维护大小为 k 的数组。

前 k 个元素直接存入水塘;从第 k+1 个元素开始,对第 i 个元素,生成 [0, i) 范围内的随机数 j,如果 j

#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>

std::vector<int> reservoirSamplingMultiple(int k) {
    std::vector<int> reservoir(k);
    int num;
    int i = 0;

    srand(time(nullptr));

    // 前 k 个元素直接填入
    while (i < k && std::cin >> num) {
        reservoir[i++] = num;
    }

    // 处理后续元素
    int count = k;
    while (std::cin >> num) {
        ++count;
        int j = rand() % count;
        if (j < k) {
            reservoir[j] = num;
        }
    }

    return reservoir;
}

使用建议与注意事项

实际应用中注意以下几点:

  • 确保随机数生成器已正确初始化(如使用 srand 或 C++11 的 random 库更佳)
  • 对于重复调用场景,避免频繁重置随机种子
  • 若需更高精度随机性,推荐使用 头文件中的分布类
  • 数据流可以是文件、网络包、传感器输入等任意顺序源
  • 算法不要求知道总长度,适合实时处理
基本上就这些。水塘抽样结构简单但逻辑精巧,是处理大数据随机抽样的经典解法。

以上就是C++怎么实现一个水塘抽样算法_C++大数据流随机抽样问题的详细内容,更多请关注其它相关文章!


# 都是  # 企业营销推广的物料  # 嘉祥县推广网站大全  # 店面营销推广费用怎么算  # 德州搜狗seo优化工具  # 威海网站建设培训  # 选服务好的网站建设  # 青岛网站优化外包  # 营销策划推广奶茶店  # 柳州定制网站建设平台  # 深圳整合营销网络推广  # 互斥  # 是一种  # c++  # 配置文件  # 多线程  # 解决方法  # 怎么做  # 重写  # 随机数  # 有什么  # stream  # ios  # 大数据  # 水塘抽样 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  微信语音通话掉线如何解决 微信语音通话稳定优化方法  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  Typer应用中动态命令行参数的解析与处理  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  Pygame教程:解决用户输入与游戏状态更新不同步问题  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  深入理解与实现最大堆的Heapify过程:常见错误与修正  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  Composer如何解决json扩展缺失的错误  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Go语言中高效处理x-www-form-urlencoded表单数据  J*aScript实现单选按钮与关联输入框的联动禁用教程  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  邮政快递单号查询入口 邮政快递物流信息在线查询入口  必由学在线入口 必由学网页版快速登录入口  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  动漫花园资源网使用步骤_动漫花园资源网下载流程  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  整合Supabase认证与Django模型:跨模式迁移的解决方案  word中如何让数字纵向排列_Word数字纵向排列方法  ArrayList与LinkedList操作复杂度详解:遍历与修改  黑猫投诉统一入口官网 消费者权益保护投诉平台  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  如何在 Excel Online 和 Google 表格中更改日期格式  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  CSS布局中意外空白:解决padding-top导致的顶部间距问题  AO3最新可访问网址 Archive of Our Own官方在线入口  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  晋江读书网页版在线登录 晋江读书电脑版官网  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  自定义Bag-of-Words实现:处理带负号的词汇权重  海棠账号登录入口_登录海棠账户同步阅读记录  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  如何更改在 Excel 中打开超链接时的默认浏览器 

搜索