一道面试题,据说是阿里巴巴的。
2010-03-31 13:56
281 查看
有一个函数int getNum(),每运行一次可以从一个数组V
里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V
里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V
里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1)(http://topic.csdn.net/u/20091024/12/989417AA-60E9-45D1-A96F-A623695FC6D7.html)
解法:
设置一个整形num,用来存放get()返回的数。调用getNum()从V
取数,按一定概率存入num中(覆盖以前的),直到getNum()返回NULL。
设getNum取的第i个数为numi,numi存入num中的概率为Pi。设Pi=1/i ( i已知时,所以这个概率很容易做到)。
则numi保留,并最后返回的情况是,numi被存入num中,且numj(i<j<=N)不被存入num。其概率为
P(numi)=Pi*(1- Pi+1) * (1 - Pi+2)* ...(1 - PN)=1/i * (i/(i+1)) * ((i+1)/(i+20)*....((N-1)/N) = 1/N
里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V
里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V
里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1)(http://topic.csdn.net/u/20091024/12/989417AA-60E9-45D1-A96F-A623695FC6D7.html)
解法:
设置一个整形num,用来存放get()返回的数。调用getNum()从V
取数,按一定概率存入num中(覆盖以前的),直到getNum()返回NULL。
设getNum取的第i个数为numi,numi存入num中的概率为Pi。设Pi=1/i ( i已知时,所以这个概率很容易做到)。
则numi保留,并最后返回的情况是,numi被存入num中,且numj(i<j<=N)不被存入num。其概率为
P(numi)=Pi*(1- Pi+1) * (1 - Pi+2)* ...(1 - PN)=1/i * (i/(i+1)) * ((i+1)/(i+20)*....((N-1)/N) = 1/N
相关文章推荐
- 一道据说是Google的面试题:25匹马的角逐
- 用代码验证阿里巴巴的一道关于男女比例的面试题
- 分析一道据说是月薪上万的面试题 - 猜生日
- 一道google的面试题(据说)
- 一道阿里巴巴面试题--海量数据查找
- 一道阿里巴巴web前端面试题拓展
- (大神勿入)据说是一道面试题,然后自己就写了一发(矩阵的螺旋输出)
- 一道阿里巴巴的面试题解答
- 一道阿里巴巴面试题--海量数据查找
- 一道阿里巴巴面试题--海量数据查找
- 用代码验证阿里巴巴的一道关于男女比例的面试题
- 据说是一道面试题
- 昨晚阿里巴巴的一道面试题分析
- 用代码验证阿里巴巴的一道关于男女比例的面试题
- 一道简单的面试题,据说90%人不能在30分钟内做出来
- 一道据说是苹果的面试题
- sql面试题一道
- 用回溯法(backtracking)解决平衡集合问题(一道微软公司面试题)
- 一道有趣的C#面试题
- 转一道有意思的面试题