水塘抽样解决随机选择问题

news2024/11/14 23:53:38

1.简介

水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到内存的情况。最常见例子为Jeffrey Vitter在其论文中所提及的算法R。

2.算法步骤:

集合使用s表示,共有n个样本,使用j表示样本次序,池塘使用p表示:

  1. 选取s中的前k个样本放入池塘p,此时j∈[0,k-1];
  2. 当j>=k时,在范围[0,j]内随机生成索引r,即r∈[0,j]:
    如果r<k,即r∈[0,k-1],则使用s[j]替换p[r],即p[r]=s[j];

3. 使用案例

3.1 可否在一未知大小的集合中,等概率随机取出K个元素?

在这里插入图片描述

    // 水塘抽样算法
    public ArrayList<Integer> randomSelect(ArrayList<Integer> list,int k){
        // 1.选取前k个元素
        ArrayList<Integer> pool=new ArrayList<>(list.subList(0,k));
        // 2.对于i<=k的元素,进行随机替换
        Random random=new Random();
        for (int i=k;i<list.size();i++){
            int r=random.nextInt(i+1);
            if (r<k){
                pool.set(r,list.get(i));
            }
        }
        return pool;
    }

4.力扣382. 链表随机节点

给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。
实现 Solution 类:

  • Solution(ListNode head) 使用整数数组初始化对象。 int getRandom()
  • 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。
    // 方式一:顺序表+二分查找
    class Solution {
        ArrayList<ListNode> nodes=new ArrayList<>();
        public Solution(ListNode head) {
            // 统计节点数量
            ListNode tail=head;
            while (tail!=null){
                nodes.add(tail);
                tail=tail.next;
            }
        }

        public int getRandom() {
            // 计算随机索引
            int index=new Random().nextInt(nodes.size());  // [0,bound)
            // 二分查找选取节点
            ListNode tar=binarySearch(index);
            return tar.val;
//            return nodes.get(index);
        }

        private ListNode binarySearch(int index) {
            int l=0,r=nodes.size()-1;
            while (l<=r){
                int m=l+(r-l)/2;
                if (m==index){
                    return nodes.get(m);
                }else if (m<index){
                    l=m+1;
                }else if (m>index){
                    r=m-1;
                }
            }
            return null;
        }
    }
/**
    * 方式二:水塘抽样算法
    *
    */
class Solution {
    ListNode head;
    Random random=new Random();
    public Solution(ListNode head) {
        this.head=head;
    }

    public int getRandom() {
        ListNode tail=head.next;
        int index=1;  // 记录第几个元素
        int val=head.val;

        while (tail!=null){
            int r=random.nextInt(index+1);
            if(r==0){
                val=tail.val;
            }
            index++;
            tail=tail.next;
        }
        return val;
    }
}

参考:
1)https://baike.baidu.com/item/%E6%B0%B4%E5%A1%98%E6%8A%BD%E6%A0%B7/10490257?fr=aladdin
2)https://blog.csdn.net/wq3095435422/article/details/124413184

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

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

相关文章

AD823AARZ-RL-ASEMI代理亚德诺AD823AARZ-RL车规级芯片

编辑-Z AD823AARZ-RL芯片参数&#xff1a; 型号&#xff1a;AD823AARZ-RL −3dB带宽&#xff1a;17 MHz 全功率响应&#xff1a;4.8 MHz 斜率&#xff1a;30 V/s 输入电压噪声&#xff1a;14 nV/√Hz 输入电流噪声&#xff1a;1 fA/√Hz 初始偏移量&#xff1a;0.12mV …

nacos集群配置高可用数据库

1.架构 nacos集群配置高可用数据库的架构其实和nacos集群的架构差不多&#xff0c;只是在数据库方面做了主从跟keepalive实现数据库的高可用&#xff0c;当mysql的master节点挂掉时&#xff0c;keepalive的vip自动漂移到slave节点&#xff0c;并通过脚本使slave节点提升为mast…

Leetcode.1992 找到所有的农场组

题目链接 Leetcode.1992 找到所有的农场组 Rating &#xff1a; 1539 题目描述 给你一个下标从 0 开始&#xff0c;大小为 m x n 的二进制矩阵 land &#xff0c;其中 0 表示一单位的森林土地&#xff0c;1 表示一单位的农场土地。 为了让农场保持有序&#xff0c;农场土地之…

QT程序退出还占进程

问题情况 程序运行时的样子&#xff1a; 程序退出时的样子&#xff1a; 其跑到了后台进程里面&#xff1a; 程序退出了&#xff0c;但在任务管理器里查看&#xff0c;其从进程里面转移到后台进程了。 这种问题&#xff0c;怎么办&#xff0c;代码里&#xff0c;应该释放的也都…

微信小程序引入广告位功能,详细步骤!!!

大家碰到过首页加载时一开始出现的广告页面&#xff0c;这种微信官方提供了一个api进行设置&#xff0c;下面我们来详细解释一下。 首先第一步需要小程序累计用户数达到1000即可开通流量主&#xff0c;成功开通流量主之后就可以创建相应的广告位了&#xff0c;包括banner广告、…

【设计模式】如何在业务开发中使用适配器模式?

文章目录前言适配器模式定义通用代码实现适用场景案例场景分析一坨坨代码实现适配器模式重构总结前言 适配器模式&#xff08;Adapter Pattern&#xff09;&#xff1a;将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个…

Can‘‘t connect to MySQL server on localhost (10061)解决方法

首先检查MySQL 服务没有启动》如果没有启动&#xff0c;则要启动这个服务。 有时候安装mysql后使用mysql命令时报错 Cant connect to MySQL server on localhost (10061)&#xff0c;或者用net start mysql 时报服务名无效&#xff0c;一般是因为mysql服务没有启动。 打开 powe…

itop-3568开发板驱动学习笔记(18)tasklet 机制

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录tasklet 简介tasklet 结构体tasklet 初始化使能 tasklet失能 tasklettasklet 调度函数tasklet 取消调度函数tasklet 实验tasklet 简介 Tasklets 机制是linux中断处理机制中的软中断延迟机制。在linux中存在着…

【ES】搜索结果处理RestClient查询文档

【ES】搜索结果处理&RestClient查询文档2.搜索结果处理2.1.排序2.1.1.普通字段排序2.1.2.地理坐标排序2.2.分页2.2.1.基本的分页2.2.2.深度分页问题2.2.3.小结2.3.高亮2.3.1.高亮原理2.3.2.实现高亮2.4.总结3.RestClient查询文档3.1.快速入门3.1.1.发起查询请求3.1.2.解析响…

【计算机图形学】图形变换(平移变换、比例变换、旋转变换、对称变换、错切变换、复合变换)

一 实验目的 编写图形各种变换的算法二 实验内容 1&#xff1a;自行设计基本图案&#xff0c;完成1-5种简单变换 实验结果如下图所示&#xff1a; 图形初始化&#xff1a; 第一次点击左键&#xff0c;实现平移变换&#xff1a; 第二次点击左键&#xff0c;实现比例变换&…

Android 性能优化——APP启动优化详解

1.1 为什么要启动优化&#xff1f; 用户希望应用能够及时响应并快速加载&#xff0c;启动时间过长的应用不能满足这个期望&#xff0c;并且可能使用户失望。 启动太慢的结果&#xff1a; 体验效果差用户放弃使用你的应用时间越长用户流失越高产品死掉 1.2 启动优化流程及分…

HDLBits-Modules 题解【Verilog模块例化】(中文翻译+英文原文,可顺带学习英文)

Moudule 概念介绍 到目前为止&#xff0c;你已经熟悉了一个模块&#xff0c;它是一个通过输入和输出端口与其外部交互的电路。更大、更复杂的电路是通过将较小的模块和其他连接在一起的部分&#xff08;例如赋值语句和always块&#xff09;组合而成的更大模块来构建的。因为模…

从零开始学OpenCV——图像灰度变换详解(线性与非线性变换)

文章目录图像灰度变化灰度变换介绍灰度线性变换灰度分段线性变换图像点运算灰度非线性变换线性点运算灰度的非线性变换&#xff1a;对数变换灰度的非线性变换&#xff1a;伽马变换灰度的非线性变换&#xff1a;对比拉伸灰度的非线性变换&#xff1a; S形灰度变换灰度的非线性变…

tomcat中出现RFC7230和RFC3986问题解析

问题截图 问题分析 出现上述问题&#xff0c;是因为各版本tomcat中对特殊字符和请求路径中携带中文参数而产生的错误提示。 解决办法 1、调整tomcat版本 tomcat 7.0.76之前的版本不会出现类似问题 2、tomcat9之前&#xff0c;修改tomcat目录底下的/conf/catalina.properti…

233:vue+openlayers绘制渐变填充色的圆形、多边形

第233个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中绘制带有渐变填充色的圆形、多边形。这里用canvas的方式去渲染,用到了DEVICE_PIXEL_RATIO,设备上的物理像素与设备无关像素 (dips) 之间的比率 (window.devicePixelRatio)。 直接复制下面的 vue+openlayer…

用ChatGPT创建一个REST API

ChatGPT是OpenAI公司开发的大型语言模型。在本文中&#xff0c;主要探讨如何使用ChatGPT在C#中创建REST API。 一、简介 ChatGPT是由人工智能研究中心OpenAI创建的尖端自然语言处理模型&#xff0c;OpenAI公司是由埃隆马斯克、萨姆奥特曼和格雷格布罗克曼共同创办的。该模型于…

360浏览器+Adobe Acrobat DC实现在线预览PDF大样校对

甲方&#xff1a;实现方正PDF文字大样校对&#xff0c;校对后在360浏览器中新开一个页面在线预览PDF文字大样校对结果。 我方实现过程&#xff1a; 1.方案选择 方案零&#xff1a;使用浏览器自带的PDF阅览器&#xff0c;经测试360极速模型,谷歌等软件能预览但是标记的PDF内容…

【笔记】大模型,大资料

大模型&#xff0c;大资料&#xff0c;loss会降低&#xff0c;准确率会增加 1大模型 1.1模型的顿悟时刻 举了一个一知半解的例子 1.2 模型 chain of thought 模型足够大时才会有比较好的作用 calibration 检测模型对于答案的confidence 会出现 “u-shape” 2.大资料 文法…

系统复杂度之【高可用】

接着&#xff0c;我们聊聊复杂度的第二个要求高可用。 参考维基百科&#xff0c;先来看看高可用的定义。 系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度&#xff0c;是进行系统设计时的准则之一。 这个定义的关键在于“ 无中断”&#xff0c;但恰好难点也在“…

Java 并发编程面试题——Future

目录1.什么是 Future 模式&#xff1f;Java 中是如何实现的&#xff1f;2.Callable、Future 与 FutureTask 分别是什么&#xff1f;2.1.Callable 接口2.2.Future 接口2.3.FutureTask 类3.CompletableFuture 类有什么用&#xff1f;1.什么是 Future 模式&#xff1f;Java 中是如…