Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1897701
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: C/C++

2014-04-30 14:30:12

随机选取一个长度为N的链表(N很大)里的K个元素 - 编程珠玑

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

以第k/m的概率抽取第m个元素,如果抽中该元素,那么再从k个已经被抽好的样本k中随机选择一个替换掉。
这样保证每个元素被抽中的概率为k/n。
计算公式为:

一个简单的版本是这样的:
如何在连续的网络流量中,等概率随机抽取1个数据包。由于这个数据包有多长并不清楚。所以你没法得到整个长度n。
先选取第一个元素,然后以1/m的概率抽取第m个元素,如果抽取成功则替换之前的抽样结果,这样保证了每次等可能的抽样。
第m个元素被选取的概率就等于第m个元素被选取×以后的元素不会被选取,公式如下:




阅读(2514) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~