C++ 中的蓄水池抽样算法2025年5月10日 | 阅读 6 分钟 采样在数据科学和统计学中发挥着作用,使我们能够从较大的总体中提取一个子集。一种有效的方法是水库采样,它涉及从大小为 (n) 的数据集或流中选择固定数量的项目 (k)。 本文旨在概述水库采样算法,并演示其在 C++ 中的实现。当从无法完全存储在内存中的海量数据集中提取样本时,水库采样非常方便。它在处理流中的每个项目时,都会维护一个固定大小的水库。 在展示说明其在 C++ 中实现的示例代码之前,我们将深入探讨其原理。此代码将涵盖初始化水库、概率替换元素以及显示输出等方面。此演示显示了随着从流中处理更多数据点,水库如何持续维护样本。 在分析、A/B 测试、推荐系统和有效处理大型真实世界数据集等领域,理解水库采样具有重要价值。 C++ 实现展示了该算法如何在通用编程语言中应用。让我们开始深入探讨水库采样的概念。 什么是水库采样算法?水库采样旨在从 n 个项目的池中选择 k 个项目,其中 n 可能是未知的。此技术使您能够通过一次数据遍历从潜在的海量数据集中获取 k 个项目的分布式样本。 水库采样的关键思想是:
这样,每个项目最终进入水库的概率相等,都是 k/n。因此,我们得到一个均匀的随机样本。 该算法的工作原理如下:
随着 i 的增加,概率 k/i 逐渐减小,因此每个项目替换水库中现有项目的可能性就越小。这使得每个项目都有相等的选择概率。随着更多项目的处理,水库维护着一个均匀的样本。 水库采样算法效率很高,处理 n 个项目只需要 O(n) 的时间复杂度,水库的大小固定为 k 个项目。它只需要对数据进行一次遍历。这使其适用于无法完全存储在内存中的大型数据流。 应用场景和使用地点
总而言之,水库采样提供了一种从连续生成的大数据流中获取小型均匀样本的方法。它在许多领域都可用于对海量真实世界数据进行统计采样和分析。 示例用于随机选择未知大小 n 的流中的 k 个项目的 C++ 水库采样算法代码。 输出 Random k = 5 items out of stream are: 55 9 61 8 12 这里的核心思想是,随着对流中的项目扫描得越多,我们随机替换水库数组中的元素,概率逐渐降低。它确保了后面的项目有机会像前面的项目一样被选中。 说明 1. 导入必要的。设置常量; 包括 cstdlib 以使用 rand() 和 srand() 使用 ctime 为 srand() 提供种子 定义 k 作为水库大小 2. 创建一个大小为 k 的数组来保存项目 3. 开发 reservoirSampling() 函数,该函数以流和大小 n 作为参数 4. 使用时间初始化数字生成器 5. 将前 k 个项目直接添加到水库数组 它用 k 个项目设置水库 6. 开始一个从 k 到 n-1 的循环来处理剩余的流项目 7. 生成一个介于 0 和 i-1 之间的数字 j,其中 i 从 k 到 n-1 8. 如果 j 介于 0 和 k-1 之间,则用项目 i 替换水库中索引 j 处的项目 此过程以递减的概率随机交换现有项目 . 概率 = k/(i+1) 9. 输出水库数组中的 k 个项目。 我们首先用 k 个项目设置水库数组。然后,当我们从 k 到 n-1 遍历流时,我们会用项目随机地交换数组中的元素。这个过程保证了我们在替换过程中实现了随机选择。 结论水库采样算法使我们能够在不知道项目数量的情况下,从数据流中随机选择 k 个项目,从而以 O(n) 的时间复杂度和 **O(k) 的空间复杂度有效地解决了问题。 C++ 实现中的关键点;
|
简介 C++ 是一种多功能且功能强大的编程语言,自 20 世纪 70 年代末问世以来经历了多次发展。C++ 由 Bjarne Stroustrup 创建。它被创建为 C 编程语言的扩展,其中包含面向对象编程原理。多年来,多个版本...
阅读 6 分钟
在本文中,我们将讨论 C++ 中的 Repunit 数,包括其属性、应用和示例。什么是? Repunit 数是迷人的数学结构,其独特属性是:已证明它们仅由数字 1 组成或包含...
阅读 4 分钟
在本文中,我们将讨论如何在 C++ 中通过翻转前缀的最小次数将二进制字符串转换为另一个字符串。问题陈述:X 和 Y 是我们拥有的两个不同的二进制字符串。两个二进制字符串的长度相同...
阅读 4 分钟
#include<iostream> 和 #include<stdio.h> 之间的区别 在本文中,我们将讨论 #include<iostream> 和 #include<stdio.h> 之间的区别。在讨论区别之前,让我们先了解每个术语。什么是 #include<iostream>? iostream 术语表示标准输入输出流。头文件 iostream 声明了控制读取操作的对象……
5 分钟阅读
引言:在提高编程性能的最后一种技术中,程序员利用的是循环展开。一种用于提高循环处理速度并同时消除某些迭代指令的技术被称为...
阅读 10 分钟
在本文中,我们将讨论 C++ 中的 std::bind1st 和 std::bind2nd。C++ 中 Std::bind1st 简介:C++ 标准库的一个重要组成部分,旨在提高 C++ 中的函数式编程能力的是 std::bind1st。通过调整二元函数的初始参数,此函数使得创建...
5 分钟阅读
在 C++ 中,char 是一种数据类型,用于表示单个字符,例如 'A' 或 '5'。有时,我们可能想将此字符转换为 int。在处理数字或想知道 ASCII 值时,这是一项常见任务...
阅读 6 分钟
在开发 Web 应用程序时,在本地测试 API 端点是确保功能和调试的常用做法。Postman 等工具通过允许开发人员向托管在 localhost 上的 API 端点发送 HTTP 请求来促进此过程。localhost API 请求是那些发送到本地主机端点的请求...
阅读 16 分钟
在现代 C++(从 C++20 开始)中,通过三向比较的概念(通常称为宇宙飞船运算符 (<=>))引入了一种强大而直观的比较对象和值的方法。此运算符允许您比较两个对象并获得一个单一值...(省略)
阅读 8 分钟
分形排序是一种非比较排序算法,它以与分形相同的方式应用分治策略。但是,分形排序的用途相对较少,与 Quicksort 等知名算法相比,其讨论和分析的频率较低……
14 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India