【算法】未知长度序列等概率采样
来源:互联网 发布:mac dock栏透明 编辑:程序博客网 时间:2024/05/16 09:15
问题是这样的,给一个序列,长度未知,要求从中随机等概率采样出m个元素。
最直观的解法是首先遍历序列,得到序列长度n,然后以m/n的概率从中随机取出m个元素。先不论从长度为n的序列中如何高效率的随机取出m个非重复元素,但是第一步遍历序列就使得算法时间复杂度为
N非常大的情况对应着下面的场景:服务器持续生成着日志数据,现在需要从这些日志流中等概率选取m条数据进行分析。此情况下,上面先求序列长度的解法已不再适用(日志数据持续产生,序列长度理论上是无限的)。此时,问题转化为:对于当前生成的一条数据,以某种机制决定是否保存这条数据,使得数据被采样到的概率相等。
假设某个时间节点下已产生的序列长度为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 = 0 while 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_num i = i + 1 except IndexError: print "End of Sequence, Sequence num:", i return resultif __name__ == '__main__': sequence = [x for x in range(0, 11)] print random_pick(10, sequence)
- 【算法】未知长度序列等概率采样
- 等概率选取未知长度的链表中的元素
- 等概率采样数据流中的数字
- 概率 & 采样
- 等概率洗牌算法
- 等概率随机洗牌算法
- 【算法】等概率问题汇总
- 等概率随机抽样算法
- 非等概率随机算法
- [数据结构与算法]哈希表(等概率情况下)查找成功与查找不成功的平均查找长度
- 概率密度采样2
- 不等概率采样
- 概率题:生成序列长度的期望(人搜)
- 概率题:10序列的期望长度(人搜)
- 未知元素个数遍历一遍随机等概率取出一个
- 面试题 从很长的数据流等概率随机采样 蓄水池抽样 Reservoir Sampling
- 随机算法--之等概率生成器
- 随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同
- 鼠标事件
- 静态链表
- 【蓝桥杯】【基础练习07】【特殊的数字】
- Java基础---------2016.4.10(2)
- 数据库SQL优化百万级数据库优化方案
- 【算法】未知长度序列等概率采样
- Nginx 基本配置(log_format,rewrite,proxy)(转)
- 循环链表
- POJ-2082 Terrible Sets (单调栈)
- HTTP 1.1与HTTP 1.0的比较
- 随机取10 个数5
- 自定义控件
- Android - 创建Wi-Fi热点、连接Wi-Fi
- No qualifying bean of type [XXX.XXX] found for dependency 解决方法