摘要 1.适用场合 2.算法简介 3.代码例子 4.Spark RangePartitioner 中的应用(待补充) 内容 1.适用场合:从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况. 2.算法简介: 从S中抽取首k项放入「水塘」中 对于每一个S[i]项(i ≥ k): 随机产生一个范围0到i的整数r 若 r < k 则把水塘中的第r项换成S[i]项 深入:papers 3.代码例子: 4.Spark RangePartiti…
蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数.其时间复杂度为 O(N),包含下列步骤 (假设有一维数组 S, 长度未知,需要从中随机选择 k 个元素, 数组下标从 1 开始), 伪代码如下: array R[k]; // result integer i, j; // fill the reservoir array to k do R[i] := S[i] done; /…
问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算法,求 random(N) 得到随机数,但是题目表明数据流极大,这种大数据量是无法一次都读到内存的,这就意味着不能像数组一样根据索引获取元素.获取 N 只能对所有数据进行遍历,耗费时间较大,并且题目强调只能遍历一遍,意味着不能先获取到 N ,那么采用分块存储数据的方法也不可取(遍历不止一遍):如果采…
1.理解 问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机的取出一行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机.这个概念即蓄水池抽样(Reservoir Sampling). 水塘抽样算法(Reservoir Sampling)思想: 在序列流中取一个数,如…
一.MCMC 简介 1. Monte Carlo 蒙特卡洛 蒙特卡洛方法(Monte Carlo)是一种通过特定分布下的随机数(或伪随机数)进行模拟的方法.典型的例子有蒲丰投针.定积分计算等等,其基础是大数定律. 蒙特卡洛方法有哪些优缺点如下: 优点:计算准确性由采样的均匀程度决定:大大简化问题复杂性 缺点: 由于要进行大量的抽样计算,对计算机速度依赖性强 目前绝大多数随机数发生器均为伪随机数,一定程度上有偏 定积分求解问题中,对于\(\color{blue}{复杂或者高维的分布}\),利用蒙特…
根据离散离散概率分布抽样是一个常见的问题.这篇文章将介绍运行时间复杂度为O(1)的 alias method 抽样算法思想. 下面举例说明: 比如 a,b,c,d 的概率分别为 0.1,0.2,0.3,0.4.如何编程实现按概率抽样呢? 最简单的方法是生成一个数组:1,2,2,3,3,3,4,4,4,4.然后随机生成一个不大于4的数.这种方法简单易实现,但当随机变量很多时,占用的空间就太大了. 再进一步,可以根据它们的概率密度分布(PDF)生成累积分布(CDF):0.1,0.3,0.6,1.然后…
蓄水池抽样——<编程珠玑>读书笔记 382. Linked List Random Node 398. Random Pick Index 从n个数中随机选取m个 等概率随机函数面试题总结         问题:如何随机从n个对象中选择一个对象,这n个对象是按序排列的,但是在此之前你是不知道n的值的.  思路:如果我们知道n的值,那么问题就可以简单的用一个大随机数rand()%n得到一个确切的随机位置,那么该位置的对象就是所求的对象,选中的概率是1/n. 但现在我们并不知道n的值,这个问题便抽…
2018-03-05 14:06:40 问题描述:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. 问题求解:如果是长度已知或者有限的问题,那么可以使用朴素的方法,先遍历一遍得到的长度.然后在得到长度后可以使用随机算法得到一个随机的index. 但是本题已经明确指出数据流长度很大或者未知,也就是说只能遍历一次,而且要保证每个数被挑选的概率相等. 标准解法是使用Reservoir Sampling算法,该…
382. 链表随机节点 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值.保证每个节点被选的概率一样. 进阶:如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? 示例: // 初始化一个单链表 [1,2,3]. ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); Solution solution = new Soluti…
随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有shuffle函数,可以对容器内部的数据打乱,保持随机排序. C++: template <class RandomAccessIterator, class URNG> void shuffle (RandomAccessIterator first, RandomAccessIterator la…