关闭

Reservoir Sampling

169人阅读 评论(0) 收藏 举报
分类:

382. Linked List Random Node
LeetCode上的一道题

Given a singly linked list, return a random node’s value from the linked list. Each node must have the same probability of being chosen.
Follow up:
What if the linked list is extremely large and its length is unknown to you? Could you solve this efficiently without using extra space?

思路

已知链表长度n时,可以使用

rand()%n  //

但此题目提示,链表长度未知,此时需要用到一些概率论的知识。

  1. 每个元素被抽取概率均为1/n时,采样等概
  2. 考虑可覆盖的采样,即后一个采样可以覆盖前一个采样。
  3. k个元素,只考虑前k,对应概率为1/k
  4. 假设第i个元素,被采中。对应事件为第i次采中,之后所有采样均未采中,计算如下
    1i(11i+1)(11n)=1n

    即第i个元素被采中的概率为1/n
  int getRandom() {
    ListNode *tem = p;
    int val = p->val;
    for (int i = 1; tem; i++) {
        if (rand() % i == 0)
            val = tem->val;
        tem = tem->next;
    }
    return val;        
  }
0
0
查看评论

[编程题] LeetCode上的Reservoir Sampling(蓄水池算法)类型的题目

目前LeetCode上Reservoir Sampling只有两道:Linked List Random Node给定一个单链表,随机返回链表中一个节点的值,每个结点被选中的概率相等。注意: 这个链表很大并且长度未知怎么办?思路:蓄水池算法。我们先一般化这个题目,改成:给定一个单链表,随机返回链表...
  • notHeadache
  • notHeadache
  • 2016-09-18 22:25
  • 1342

蓄水池抽样算法 (Reservoir Sampling Algorithm)

蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数。其时间复杂度为 O(N),包含下列步骤 (假设有一维数组 S, 长度未知,需要从中随机选择 k 个元素, 数组下标从 1 开...
  • DT1105461889
  • DT1105461889
  • 2016-12-29 21:06
  • 419

蓄水池抽样(reservoir sampling)

蓄水池抽样(reservoir sampling),通俗一点而言,就是等概率的抽样算法,一般是在不知道总体样本的数量情况下。
  • u013011270
  • u013011270
  • 2016-08-15 21:51
  • 854

Reservoir sampling(水塘抽样)

题目1: 给出一个数据流,这个数据流的长度很大或者未知。并且对该数据流中数据只能访问一次。请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等。 对于复杂问题一定要学会归纳总结,即从小例子入手,然后分析,得出结论,然后在证明。不然遇到一个抽象问题,不举例感觉这个问题,直接解还是比较难...
  • My_Jobs
  • My_Jobs
  • 2015-09-11 15:28
  • 2411

Reservoir Sampling

蓄水池算法~~~
  • Fivesplus
  • Fivesplus
  • 2015-06-10 23:15
  • 190

Reservoir sampling

Having an input stream of n, select k elements with equal probability. Algorithm:  1. select k elements into the result first 0....k-1 2. ...
  • nicaishibiantai
  • nicaishibiantai
  • 2015-04-17 11:58
  • 509

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 va...
  • doc_sgl
  • doc_sgl
  • 2013-08-31 21:03
  • 1229

水塘抽样 - Reservoir Sampling

Reservoir Sampling( Reservoir sampling ) 给一个Streaming的Data,未知长度,要求在Streaming结束后返回N个Data,且是等概率的 O(L) 假设数组S以0开始: 从S中抽取前k项放入「...
  • danteLiujie
  • danteLiujie
  • 2016-06-07 22:37
  • 491

蓄水池抽样 - Reservoir Sampling

转自: http://www.guokr.com/blog/745588/ 题目要求: 从个元素中随机抽取个元素,但的个数无法事先确定。 在实际应用中,往往会遇到很大数据流的情况。因此,我们无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一遍就得到所选取的元素,并且保证得...
  • YtdxYHZ
  • YtdxYHZ
  • 2016-08-02 03:04
  • 236

蓄水池算法(Reservoir Sampling)

蓄水池算法(Reservoir Sampling) 2011年10月16日 what 发表评论 阅读评论 问题描述,从N个元素中随机抽取k个元素,使得每个元素被抽取的概率相同,并且事先不知道N的值。 解法: ?View Code JAVA ...
  • qq_30089175
  • qq_30089175
  • 2017-12-04 10:03
  • 23
    个人资料
    • 访问:7908次
    • 积分:558
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:5篇
    • 译文:0篇
    • 评论:9条