博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度面试题
阅读量:5257 次
发布时间:2019-06-14

本文共 756 字,大约阅读时间需要 2 分钟。

题目:为分析用户行为,系统常需存储用户的一些query,但因query许多,故系统不能全存,设系统每天仅仅存m个query,现设计一个算法,对用户请求的query进行随机选择m个,请给一个方案,使得每一个query被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量。

解析:

取一个[1,m+i]中的随机数,假设随机数落在(m,m+i]时,应该保留原来的m个数;假设随机数落在[1,m]中,则应该用最新的一条记录代替[1,m]中随机的一个数。

证明例如以下:
如果如今系统读取第n+1条记录,如今存储的m条记录都是前面m+n条记录中以m/(m+n)的概率留下来的;
取一个[1,m+n+1]的随机数,依照上述策略。
如今新记录能保留在m数组的概率为m/(m+n+1)
原来m数组中的数(设为A)在本轮选择中还能保留的条件概率(条件是,上一轮选择中,A被保留):
(n+1)/(m+n+1)+m/(m+n+1)*(1-1/m)=(m+n)/(m+n+1)。
然后要乘以其原来保留下的概率。得到的A仍在m数组中的概率为m/(m+n+1)。

简单而言就是分为两种情况:

1、原来m数组中的数被替换成功的概率:

就是说这个数本来肯定被选中了,并且被新选择的人一个所替换(可是不包含新加入的那个数,因为新加入,不好加入选择队列)

m/(m+n)*(m+n)/(m+n+1)=m/(m+n+1)

2、原来m数组中的数保留下来的概率:

新的选择情况下选择了[1,m]之间的数可是并没有替换这个数

m/(m+n+1)*(1-1/m)=(m-1)/(m+n+1)

当m<<n的时候,这两个值差点儿相等。

转载于:https://www.cnblogs.com/mengfanrong/p/3953789.html

你可能感兴趣的文章
[Leetcode] Binary Tree Zigzag Level Order Traversal
查看>>
[C++] c++中二进制文件的创建与使用
查看>>
C#脚本引擎 CS-Script 之(一)——初识
查看>>
codeforces742B
查看>>
codeforces645B
查看>>
The second curriculum design experiment report in spring 2019
查看>>
Java内存模型
查看>>
jms的初步认识
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
机顶盒webview开发调试
查看>>
js中的arguments
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
crypto加密
查看>>
Apache Jackrabbit 2.6.0 发布
查看>>
Reporting Service 2000的一些技巧总结
查看>>
echarts饼图显示百分比
查看>>
C#中的out string temp是什么意思?【转】
查看>>
第十二次作业
查看>>
喜欢的话
查看>>
[jQuery]在WCF 4中如何用JSONP轻松实现跨域Ajax请求
查看>>