等概率选取未知长度的链表中的元素
来源:互联网 发布:七天网络网页注册 编辑:程序博客网 时间:2024/05/06 06:05
有个链表,长度未知,要随机(等概率)选取其中的item
代码如下:
int nmatch = 0;
for ( p=list; p!=NULL; p=p->next ){
if ( rand() % ++nmatch == 0 ){
wanted = p;
}
}
wanted 即为所求item
命题: 链表中的每个元素的选择概率为1/n,其中n=链表长度
以n为归纳条件
证明如下:
当n=1时,有100%的概率选取第1个item,链表中的每个元素的选择概率为1/1
当n=2时,第一次循环时有100%的概率选取第1个item,第2次循环时有50%的概率选取第2个item(即替换了第1个元素),因此当链表有2个item时,任何一个被选取的概率都是1/2
假设当n=k时,链表中的每个元素的选择概率为1/k
当n=k+1时,将k+1个元素的链表分成两部分(前k个元素组成的链表和第k+1个元素)。由归纳假设,前k次循环可以使链表的前k个元素的每一个被选中的概率为1/k,设前k个元素中的任何一个为i,则选取i的概率为1/k。
最后一次循环的if ( rand() % ++nmatch == 0 ),使得选取第k+1个元素的概率是1/(k+1)。
则在k+1个元素的链表中选取i的概率为1/k-1/k*1/(k+1)=1/(k+1),其中1/k表示前k个元素中选中i的概率,1/k*1/(k+1)表示选中i之后又选了第k+1个元素(即选中的元素i被k+1替换了)。由于i的一般性,则前k个元素的选取概率都为1/(k+1)。从而在有k+1个元素的链表中,每个元素的选取概率都是1/(k+1),得证。
- 等概率选取未知长度的链表中的元素
- 等概率选取随机流中的元素
- 【算法】未知长度序列等概率采样
- 随机从长度未知的数组中抽取数字,且保证每个元素被抽到的概率相同
- 一次遍历等概率选取字符串中的某个字符
- 随机选取一个长度为N的链表(N很大)里的K个元素 - 编程珠玑
- 随机选取一个长度为N的链表(N很大)里的K个元素
- 学习篇--快速查询未知长度单链表的中间元素
- 给定一个未知长度的整数流,如何随机选取一个数?
- 未知元素个数遍历一遍随机等概率取出一个
- 海量数据等概率随机选取问题
- 等概率选取问题 Random Pick
- 海量数据等概率选取问题
- 海量数据等概率选取问题
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 未知元素的兼容问题
- 一个有头尾的单链表,长度未知,如何快速的找出位于中间的那个元素?
- 百度面试题:一个单链表,长度未知,如何快速的找出位于中间的那个元素
- 我最近一直感觉后悔
- Jabber问与答(部分)
- 在Eclipse中使用ANT灵活构建Web应用
- Velocity学习与实践(一)
- 在VC中自建操作BMP位图文件的类
- 等概率选取未知长度的链表中的元素
- 本命年,奔波年
- visual studio.net已检测到指定的web服务器运行的不是asp.net1.1版
- 回来了
- RUP中的几种Iteration pattern(完):"Grand Design" Lifecycle,Hybrid Strategies
- 开篇
- 汉城大学学生口中的韩国IT产业战略
- 网易创始人丁磊在广州互联网聚会上发表的观点
- checkBoxList应用于Gridview