问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算法,求 random(N) 得到随机数,但是题目表明数据流极大,这种大数据量是无法一次都读到内存的,这就意味着不能像数组一样根据索引获取元素.获取 N 只能对所有数据进行遍历,耗费时间较大,并且题目强调只能遍历一遍,意味着不能先获取到 N ,那么采用分块存储数据的方法也不可取(遍历不止一遍):如果采…
蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 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; /…
2018-03-05 14:06:40 问题描述:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. 问题求解:如果是长度已知或者有限的问题,那么可以使用朴素的方法,先遍历一遍得到的长度.然后在得到长度后可以使用随机算法得到一个随机的index. 但是本题已经明确指出数据流长度很大或者未知,也就是说只能遍历一次,而且要保证每个数被挑选的概率相等. 标准解法是使用Reservoir Sampling算法,该…
蓄水池抽样——<编程珠玑>读书笔记 382. Linked List Random Node 398. Random Pick Index 从n个数中随机选取m个 等概率随机函数面试题总结         问题:如何随机从n个对象中选择一个对象,这n个对象是按序排列的,但是在此之前你是不知道n的值的.  思路:如果我们知道n的值,那么问题就可以简单的用一个大随机数rand()%n得到一个确切的随机位置,那么该位置的对象就是所求的对象,选中的概率是1/n. 但现在我们并不知道n的值,这个问题便抽…
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…
1.理解 问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机的取出一行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机.这个概念即蓄水池抽样(Reservoir Sampling). 水塘抽样算法(Reservoir Sampling)思想: 在序列流中取一个数,如…
问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would you read a text file, and select and print one random l…
问题起源于编程珠玑Column 12中的题目10,其描述如下: How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would you read a text file, and select and print one random l…
copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. --------------------------------------------------------------------------------------- 问题 随机抽样问题表示如下: 要求从N个元素中随机的抽取k个元素,其中N无法确定. 这种应用的场景一般是数据流的情况下,由于数据…
水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况. 在高德纳的计算机程序设计艺术中,有如下问题:可否在一未知大小的集合中,随机取出一元素?.或者是Google面试题: I have a linked list of numbers of length N. N is very large and I don't know in advance the exact value of N. How…
Given a stream of elements too large to store in memory, pick a random element from the stream with uniform probability. To solve the problem which n size is unknown, Reservior Sampling is a perfect algorithm to use: Reservoir sampling algorithm can…
前言: 蓄水池抽样:从N个元素中随机的等概率的抽取k个元素,其中N无法确定. 适用场景: 模式识别等概率抽样,抽样查看渐增的log日志(无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一遍就得到所选取的元素,并且保证得到的元素是随机的算法). 伪代码: init : a reservoir with the size: k for i= k+1 to N M=random(1, i); if( M < k) SWAP the Mth value and ith value end…
蓄水池采样算法解决的是在给定但长度未知的大数据集中,随机等概率抽取一个数据.如果知道数据的长度,可以用随机数rand()%n得到一个确切的随机位置,或者分块取值来构造随机,那么该位置的对象就是所求的对象,选中的概率是1/n.那长度未知特别是如果这个大数据集不能一次性放入内存中,蓄水池抽样算法就非常有用,在我的项目中采用的蓄水池随机抽样还加入了权重的计算. 其中方法中核心代码,也就是蓄水池抽样就是如下代码. if (i < spotQuantity) { titleIndexList.Add(i)…
https://blog.csdn.net/huagong_adu/article/details/7619665 https://www.jianshu.com/p/63f6cf19923d https://www.cnblogs.com/snowInPluto/p/5996269.html https://www.cnblogs.com/xudong-bupt/p/4053652.html https://www.jianshu.com/p/51f7089c082b 概念: 在一个给定长度的…
蓄水池采样算法 问题描述分析 采样问题经常会被遇到,比如: 从 100000 份调查报告中抽取 1000 份进行统计. 从一本很厚的电话簿中抽取 1000 人进行姓氏统计. 从 Google 搜索 "Ken Thompson",从中抽取 100 个结果查看哪些是今年的. 这些都是很基本的采用问题. 既然说到采样问题,最重要的就是做到公平,也就是保证每个元素被采样到的概率是相同的.所以可以想到要想实现这样的算法,就需要掷骰子,也就是随机数算法.(这里就不具体讨论随机数算法了,假定我们有了…
  知识复习 空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到一个有质量保证的结果. 数据流算法:是指数据源源不断地到来,根据到来的数据返回相应的部分结果.适用于两种情况:第一.数据量非常大仅能扫描一次时,可以把数据看成数据流,把扫描看成数据到来.第二.数据更新非常快,不能把所有数据都保存下来再计算结果,此时可以把数据看成是一个数据流. 在一些情况下,空间亚线…
转自:孤影醉残阳 http://hi.baidu.com/siyupy/item/e4bb218fedf4a0864414cfad 随机抽样问题(蓄水池问题Reservoir Sampling) 随即抽样问题: 要求从N个元素中随机的抽取k个元素,其中N无法确定. 是在 <计算机程序设计与艺术> 中看到的这个题目,书中只给出了解法,没给出证明. 解决方法是叫Reservoir Sampling (蓄水池抽样) Init : a reservoir with the size: k for i=…
一.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.然后…
参考: K最短路径算法之Yen's Algorithm Yen's algorithm 基于网络流量的SDN最短路径转发应用 K条最短路径算法:Yen's Algorithm 算法背景 K 最短路径问题是最短路径问题的扩展和变形.1959 年,霍夫曼(Hoffman) 和帕夫雷(Pavley)在论文中第一次提出k 最短路径问题. k 最短路径问题通常包括两类:有限制的k 最短路问题和无限制的K 最短路问题. 前者要求最短路径集合不含有回路,而后者对所求得的最短路径集合无限制. 算法简介 Yen'…
摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的和人工智能领域内的研究热点.数据集中的频繁模式作为一种有价值的信息,受到了人们的广泛关注,成为了数据挖掘技术研究领域内的热门话题和研究重点. 传统的频繁模式挖掘技术被用来在事务数据集中发现频繁项集,然而随着数据挖掘技术应用到非传统领域,单纯的事务数据结构很难对新的领域的数据进行有效的建模.因此,频繁…
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点E条边. 该算法主要流程是: 初始化.到起点s的距离distTo[s]设置为0,其余顶点的dist[]设置为正无穷: 以任意次序放松图中的所有E条边,重复V轮: V轮放松结束后,判断是否存在负权回路.如果存在,最短路径没有意义. 根据流程可以给出代码,如下 package Chap7; import…
一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小.像 Kruskal算法一样,Prim算法也是贪婪算法. 二.Prim算法思想 Prim算法的思想很简单,一棵生成树意味着必须连接所有顶点.因此必须将两个不相交的顶点子集连接起来才能生成生成树 .并且它们必须以最小的权重边连接,以使其成为最小的生成树(MST).它从一棵空的生成树开始.这个…
一.算法介绍 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应用.和Boruvka算法不同的地方是,Kruskal 算法在图中存在相同权值的边时也有效.最小生成树是一副连通加权无向图中一棵权值最小的生成树(minimum spanning tree,简称MST).生成树的权重是赋予生成树的每条边的权重之和.最小生成树具有 (V – 1) 个边,其中 V 是给定图中的…
环境:Visual Studio 2017 + .Net Framework 4.5 应用场景:在画板上查找起始点和目标点之间的最短最直路径,最后画出连接两个点之间的折线. 算法简介:A*算法是一种性能较高的最优路径搜索算法,由Stanford Research Institute(now SRI International)的Peter Hart,Nils Nilsson和Bertram Raphael于1968年发表.A*算法可看做是对Dijkstra算法的扩展和优化,其性能一般情况下比Di…
Atitit.软件中见算法 程序设计五大种类算法 1. 算法的定义1 2. 算法的复杂度1 2.1. Algo cate2 3. 分治法2 4. 动态规划法2 5. 贪心算法3 6. 回溯法3 7. 分支限界法3 1. 算法的定义  算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空…
目录 1 问题描述 2 解决方案 2.1 构造最小生成树示例 2.2 伪码及时间效率分析 2.3 具体编码(最佳时间效率)   1 问题描述 何为Kruskal算法? 该算法功能:求取加权连通图的最小生成树.假设加权连通图有n个顶点,那么其最小生成树有且仅有n - 1条边. 该算法核心思想:从给定加权连通图中,选择当前未被选择的,不能形成回路且权值最小的边,加入到当前正在构造的最小生成树中. 2 解决方案 2.1 构造最小生成树示例 下面请看一个具体示例: 给定一个条边,按照从小到大排序依次为:…
传送门: Dijkstra Bellman-Ford SPFA Floyd 1.算法思想 Bellman-Ford算法时间复杂度比较高,在于Bellman-Ford需要递推n次,每次递推需要扫描所有的边,在递推n次的过程中,很多判断是多余的,所以考虑用队列优化,减少不必要的判断,这种算法称为SPFA(Shortest Path Faster Algorithm) SPFA算法的大致流程就是用一个队列来进行维护,初始时将源点加入队列,每次从队列中取出一个顶点,并对它所有相邻的节点进行松弛,如果某个…
一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{source_vertex},dist数组初始值为$dist[i] = G.arc[source\_vertex][i],i=0,1,\ldots,n-1$ (2)从顶点集合V-vertex_set中选出$v_j$,满足$dist[j] = Min\left\{dist[i] | v_i∈V-vertex\_…