美文网首页
蓄水池算法

蓄水池算法

作者: Jonddy | 来源:发表于2018-04-23 16:38 被阅读0次
问题描述:

给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍历这个链表一次。你的算法必须保证取出的元素恰好有k个,且它们是完全随机的(出现概率均等)。

该算法是针对从一个序列中随机抽取不重复的k个数,保证每个数被抽取到的概率为k/n这个问题而构建的。做法是:

  • 首先构建一个可放k个元素的蓄水池,将序列的前k个元素放入蓄水池中。
  • 然后从第k+1个元素开始,以k/n的概率来决定该元素是否被替换到池子中。 当遍历完所有元素之后,就可以得到随机挑选出的k个元素。复杂度为O(n).

伪代码:

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 for
证明每个数被取到的概率为k/n:
蓄水池算法证明

代码:

import time
import random
import copy
 
def reservoirSampling(seq, k):
    localSeq = copy.deepcopy(seq)
    N = len(localSeq)  
    for i in range(k, N, 1):
        M = int(random.uniform(0, i))
        if M < k :
            temp = copy.deepcopy(localSeq[M])
            localSeq[M] = copy.deepcopy(localSeq[i])
            localSeq[i] = temp
    return localSeq[0:k]
     
a = [4,5,6,3,4,7,7,4,3,3,2,4,5,5,6,9,5,4,3,45,3,23,44,55,33,5,8]
k = 5
 
print reservoirSampling(a, k)

import random

def sample(iterable, n):
    """
    Returns @param n random items from @param iterable.
    """
    reservoir = []
    for t, item in enumerate(iterable):
        if t < n:
            reservoir.append(item)
        else:
            m = random.randint(0,t)
            if m < n:
                reservoir[m] = item
    return reservoir


转自链接:https://www.jianshu.com/p/858cd54238b2

相关文章

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

    蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起...

  • 蓄水池算法

    问题描述: 给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素。你只能遍...

  • 蓄水池算法

    今天在网上看题目时,发现一个十分有趣的算法,叫蓄水池算法(Reservoir Sampling),牵扯到一点概率论...

  • 蓄水池算法

    最近有个需求,需要从不固定大小的数据集中取固定数量的数据作为样本,有个同学提到了蓄水池算法,于是了解了一下。 蓄水...

  • 2021-02-01 蓄水池抽样算法(Reservoir Sam

    蓄水池抽样算法(Reservoir Sampling)[https://www.jianshu.com/p/7a9...

  • leetcode382. Linked List Random

    这道题本质是到蓄水池算法 https://leetcode.com/problems/linked-list-ra...

  • 2018-07-02

    Q1: 蓄水池算法pick 1Q2: reverse linked listQ3: reverse linked ...

  • 蓄水池抽样算法

    问题描述 给出一个数据流,这个数据流的长度很大或者未知(内存无法一次性容纳下),并且对该数据流中数据只能访问一次。...

  • 蓄水池抽样算法

    面试题: 如果有一个文件很大,内存很大,不知道有多少行。你的任务是随机输出一行。文件只能遍历一次。解析:算法就是需...

  • 蓄水池采样算法

    解决问题:在不知道数据规模n的前提下,实现以的概率去数据进行采样思路:首先设计容量为k的容器C,把前k个元素放入,...

网友评论

      本文标题:蓄水池算法

      本文链接:https://www.haomeiwen.com/subject/brrllftx.html