2018-03-05 14:06:40

问题描述:给出一个数据流,这个数据流的长度很大或者未知。并且对该数据流中数据只能访问一次。请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等。

问题求解:如果是长度已知或者有限的问题,那么可以使用朴素的方法,先遍历一遍得到的长度。然后在得到长度后可以使用随机算法得到一个随机的index。

但是本题已经明确指出数据流长度很大或者未知,也就是说只能遍历一次,而且要保证每个数被挑选的概率相等。

标准解法是使用Reservoir Sampling算法,该算法由Knuth的学生在斯坦福读计算机博士时想出来。

算法描述:

相关问题:

  • 382. Linked List Random Node

问题描述

问题求解:

public class Solution {ListNode head;Random rand;/** @param head The linked list's head.Note that the head is guaranteed to be not null, so it contains at least one node. */public Solution(ListNode head) {this.head = head;this.rand = new Random();}/** Returns a random node's value. */public int getRandom() {int k = 1;ListNode cur = head;List<Integer> reservoir = new ArrayList<>();int i = 0;while (i < k && cur != null) {reservoir.add(cur.val);cur = cur.next;i++;}i++;while (cur != null) {if (rand.nextInt(i) < k) {reservoir.set(rand.nextInt(k), cur.val);}i++;cur = cur.next;}return reservoir.get(0);}
}

  • 398. Random Pick Index

问题描述:

问题求解:

如果仅存在一个数,那么将之index返回,如果存在多个数,其index的返回值需要是等概率的,也就是说对于k个相同的数,我们需要每个index的返回概率为1/k。根据蓄水池算法,我们首先要建立一个大小为1的池子,然后对每个出现的target的index以当前出现个数的概率选择他,然后从池中随机挑选一个数来与它交换,由于池中仅有一个值,因此只需要将res的值变为挑选值即可。

public class RandomPickIndex {int[] nums;Random ran;public RandomPickIndex(int[] nums) {this.nums = nums;ran = new Random();}public int pick(int target) {int res = -1;int cnt = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != target) continue;if (ran.nextInt(++cnt) == 0) res = i;}return res;}
}

转载于:https://www.cnblogs.com/TIMHY/p/8508759.html

蓄水池抽样算法 Reservoir Sampling相关推荐

  1. 蓄水池抽样算法(reservoir sampling)

    蓄水池抽样算法(reservoir sampling) 场景:在长度未知的数据流中,等概率地采样一定数量的数据.即,数据量N未知,若要求采样k个数据,采样概率保证kN\frac{k}{N}Nk​. 要 ...

  2. 蓄水池抽样(Reservoir Sampling)

    蓄水池抽样解决的问题是当不知道N的大小时从N个数中等概率抽取k个数. 要理解这个问题,首先从抽取一个数来看. 在知道数字总数N的大小的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个数字 ...

  3. 蓄水池采样算法的python实现_蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起,那个小学数学老师带他做"小明对水池边加水边放水,求何时能加满水" ...

  4. 图解连续学习中的蓄水池抽样算法(The Illustrated Reservoir sampling)

    图解连续学习中的蓄水池抽样算法The Illustrated Reservoir sampling 前言 什么是Reservoir Sampling? 蓄水池抽样算法(Reservoir sampli ...

  5. 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)

    分类目录:<机器学习中的数学>总目录 蓄水池抽样算法(Reservoir Sampling Algorithm)解决了未知长度数据的均匀抽样问题,即:给定一个数据流,数据流长度NNN很大, ...

  6. 蓄水池采样算法的python实现_常用算法-蓄水池抽样算法

    Leetcode上遇到一道题,题目是这样的: 这道题的关键是链表的长度不知道,但是要使随机返回每个元素的概率相等,这一下就难倒我了,如果知道链表的长度k,从0到k中随机选择一个整数就好了呀,可现在不知 ...

  7. 水塘抽样(Reservoir sampling)

    水塘抽样(Reservoir sampling) 题目:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中的数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. ...

  8. LeetCode Random Pick Index(蓄水池抽样算法)

    问题:给出一个数组,存在相同的数,随机输出目标数所在的下标 思路:使用蓄水池抽样算法,当第一次找到目标数时,作为选取.接着如果随机数等于0,则选取.在遍历完后,直接返回选取的值 具体代码参考: htt ...

  9. 【大数据算法】蓄水池抽样算法

    一.题目来源: 这个题目的由来是周围有人讨论到去面试(某8)的时候遇到了这个问题.另外正好HIT有个视频也有这个内容,故记录一下: 二.题目描述:     该人面试的时候问的是: 如何从二进制文件中等 ...

最新文章

  1. [转]对于非数据库字段的查询过滤以及app_query.append的用法
  2. swift button一些简单设置
  3. 小米 华为都要造车?.NET高薪潮来了!(附招聘链接)
  4. (38)FPGA原语设计(BUFH)
  5. java序列化原理_Java序列化机制和原理
  6. 用c#实现 catia插件speos的部分功能
  7. 关于SVN报错问题错误码E175002的解决方案
  8. 搜索关键词,生成云图
  9. android手机ipad传照片,教你iPhone与安卓跨平台如何传照片
  10. ArcGIS导入excel文件
  11. 联发科mtk手机处理器怎么样_2019年全球手机处理器市场份额新报告高通无悬念第一,联发科第二,三星第三...
  12. HAZOP到LOPA和SIL验算软件-歌略RiskCloud
  13. Transferability vs. Discriminability: Batch Spectral Penalization for Adversarial Domain Adaptation
  14. Python中的面向对象编程练习
  15. 谈谈C++中的swap函数
  16. Eclipse替换和查找快捷键
  17. vue遍历map对象
  18. Jupyter Nptebook里面的这几个知识点你知道吗
  19. 计算机课件制作总结,课件制作培训总结5篇
  20. PAT 1016 Phone Bills (25分) 逻辑较为复杂 sort() + map

热门文章

  1. 在linux上获得线程id的方法
  2. [react] 装饰器(Decorator)在React中有什么应用?
  3. 学会使用ant design封装一个锚点组件
  4. 前端学习(3063):vue+element今日头条管理-总页码处理2
  5. 前端学习(3017):vue+element今日头条管理--优化封装请求
  6. [html] html中p标签内为何不能嵌套div标签?
  7. [html] 如何判断用户正在操作页面?当页面一个小时没有操作时跳转到指定页面如何做?
  8. [vue] 说说组件的命名规范
  9. [css] flex与其他有什么不同,用它有什么好处?
  10. 前端学习(2677):懂代码之表格BaseTable删除操作