问题是这样的,给一个序列,长度未知,要求从中随机等概率采样出m个元素。

最直观的解法是首先遍历序列,得到序列长度n,然后以m/n的概率从中随机取出m个元素。先不论从长度为n的序列中如何高效率的随机取出m个非重复元素,但是第一步遍历序列就使得算法时间复杂度为O(N2)O(N^2),空间复杂度为O(N)O(N)。在N非常大的情况下,此种解法几乎是不可能的。

N非常大的情况对应着下面的场景:服务器持续生成着日志数据,现在需要从这些日志流中等概率选取m条数据进行分析。此情况下,上面先求序列长度的解法已不再适用(日志数据持续产生,序列长度理论上是无限的)。此时,问题转化为:对于当前生成的一条数据,以某种机制决定是否保存这条数据,使得数据被采样到的概率相等。

假设某个时间节点下已产生的序列长度为n,按以下采样策略:
- 若n<=mn,则之前的数据需全部保留,此时数据被采样的概率均等(都为1);
- 若n>mn>m,则以m/nm/n的概率保留最新元素,并从已有长度为m的结果序列中随即取出一个元素与之交换,此时结果序列中的每个元素被采样到的概率都应该是m/nm/n,证明如下:
- n=m+1n = m + 1时,原结果序列下元素保留下来的概率为mm+1∗(1−1m)+(1−mm+1)=mm+1\frac{m}{m+1}*(1-\frac{1}{m})+(1-\frac{m}{m+1})=\frac{m}{m+1},即mn\frac{m}{n};
- n=m+2n = m + 2时,原结果序列下元素保留下来的概率为mm+1∗(mm+2∗(1−1m)+(1−mm+2))=mm+2\frac{m}{m+1}*(\frac{m}{m+2}*(1-\frac{1}{m})+(1-\frac{m}{m+2}))=\frac{m}{m+2},即mn\frac{m}{n};
- n=m+kn = m + k时,原结果序列下元素保留下来的概率为mm+k−1∗(mm+k∗(1−1m)+(1−mm+k))=mm+k\frac{m}{m+k-1}*(\frac{m}{m+k}*(1-\frac{1}{m})+(1-\frac{m}{m+k}))=\frac{m}{m+k},即mn\frac{m}{n};

因此,按以上策略采样,能够保证元素在任意时间节点下的采样概率均等,且为mn\frac{m}{n}。算法时间复杂度为O(N)O(N)。

Python代码

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: NeoMT<matengneo@gmail.com>import random# 输入sequence长度未知,m为需要采样的数据个数
def random_pick(m, sequence):result = []i = 0while True:try:current_num = sequence[i]if i < m:result.append(current_num)else:j = random.randint(0, i)if j < m:result[j] = current_numi = i + 1except IndexError:print "End of Sequence, Sequence num:", ireturn resultif __name__ == '__main__':sequence = [x for x in range(0, 11)]print random_pick(10, sequence)

【算法】未知长度序列等概率采样相关推荐

  1. matlab无限长序列卷积,怎样求未知长度序列的卷积

    程序是用fortran写的,但这里没有单独的板块,所以发到这里了,其实这不是一个程序语言的问题,用matlab编的话也会出现这个问题. 关于卷积,怎样求两个未知长度序列的卷积,就是不声明数组,只保存当 ...

  2. 自动驾驶路径规划——基于概率采样的路径规划算法(RRT、RRT*)

    目录 1. RRT算法背景 1.1 RRT算法核心思想 1.2 RRT算法优缺点 2. 经典RRT算法 2.1 RRT算法流程 2.2 RRT伪代码 3. 基于目标概率采样 4. RRT*算法 4.1 ...

  3. 自动驾驶路径规划——基于概率采样的路径规划算法(PRM)

    目录 1. PRM算法流程 1.1 预处理 1.2 搜索 2. PRM算法案例 2.1 构型采样 2.2 邻域计算 2.3 图搜索(A*搜索) 3. 采样数量的影响 4. 采样策略 4.1 基于障碍物 ...

  4. 光线追踪渲染实战(五):低差异序列与重要性采样,加速收敛!

    项目代码仓库: GitHub:https://github.com/AKGWSB/EzRT gitee:https://gitee.com/AKGWSB/EzRT 目录 前言 1. 低差异序列介绍 2 ...

  5. 贪心算法求解一个序列中出现次数最多的元素问题

    贪心算法求解一个序列中出现次数最多的元素问题 题目: 指定n个正整数,编写一个实验程序找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入描述:输入的第1行只有一个正整数n(1 ...

  6. 【算法】如何根据算法在赌场发家致富?汤普森采样之多臂强盗算法!

    汤普森采样-Thompson Sampling 之概念篇 关键词:机器学习,在线学习,人工智能,强化学习 如果你已经熟悉了概念可以直接看代码篇: [算法应用]Thompson Sampling–汤普森 ...

  7. 32 ART DMA 接收未知长度的数据和发送

    STM32实现USART+DMA接收未知长度的数据和发送 STM32学习笔记三 竹天笑 前言:开始学USART+DMA的时候看到帖子<STM32 UART DMA实现未知数据长度接收>,觉 ...

  8. 算法心经:数学的应用:概率的应用

    终于写到重头戏了,如果说前面的微分积分还属于基础理论,而与我们日常的算法设计距离有点远的话,那么后面的概率.矩阵.空间立体几何,可就是和应用息息相关了. 为什么要有概率 概率是个数学概念,但它在计算机 ...

  9. 蓄水池采样算法的python实现_蓄水池采样算法的python实现_蓄水池抽样及实现

    蓄水池抽样(Reservoir Sampling)是一个很有趣的问题,它能够在o(n)时间内对n个数据进行等概率随机抽取,例如:从1000个数据中等概率随机抽取出100个.另外,如果数据集合的量特别大 ...

最新文章

  1. ORA-600 [kddummy_blkchk] [18038] 一例
  2. 通达oa 不允许从该ip登陆_通达OA-命令执行漏洞复现
  3. LeetCode 1897. 重新分配字符使所有字符串都相等
  4. RefreshParenwin 打开子窗体 并回发
  5. 这届年轻人为什么都不爱看电视了?
  6. 算法导论第三版 第1章习题答案
  7. 被V神点赞, 我是如何用五子棋打败以太坊排名最高的应用的? |人物志
  8. Hypergraph Neural Networks超图神经网络
  9. 【ZZULIOJ】1097: 计算平均成绩(函数专题)
  10. Mac下解压.bin文件
  11. HDTune硬盘检测工具
  12. BM3D算法相关笔记
  13. [编程题]雀魂启动!
  14. matlab锯齿交换,MATLAB折线消除锯齿平滑
  15. 利用虚拟机virtualbox配置智汀家庭云,让米家设备连接Homekit
  16. 基于Java+SpringBoot+Thymeleaf+Mysql新冠疫苗预约系统设计与实现
  17. 数字手写体识别python实现(全连接神经网络)
  18. Linux开机自启动
  19. 军品研制过程所需文件-进阶版
  20. 2.4.2 死锁的处理策略-预防死锁(破坏互斥条件、破坏不可剥夺条件、破坏请求和保持条件、破坏循环等待条件)

热门文章

  1. element-ui如何在表格中插入图片
  2. 重金押注AR眼镜制造商Nreal,阿里按下元宇宙加速键
  3. 终于有人把云计算、大数据和人工智能讲明白了!(1)
  4. OSChina 周三乱弹 ——只有我还散发着单身狗的清香
  5. IT书籍力荐--安全 WEB设计 软考 计算机等级考试 JAVA技术2
  6. mysql表增加压缩属性_InnoDB列压缩,提升DB性能
  7. 世界知名IT公司名字由来
  8. openKylin 0.7.5 更新版本发布,完成 KMRE 适配,并修复 150+ 已知 Bug!
  9. 通达信程序接口与量化交易之间的关系
  10. 手机数控模拟器安卓版_数控机床模拟器手机版下载-数控机床模拟器 安卓版v1.1.4-PC6手游网...