算法导论5.3-3

转自风清云淡的博客,他给出的解法非常的妙。

问题:

描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1)。作为a和b的函数,你的程序的期望运行时间是多少?
注:RANDOM(0,1)以等概率输出0或者1,
      要求RANDOM(a,b)以等概率输出[a,b]之间的数(整数)

 

解决方案:

         1,取 n=b-a+1,取最小的正整数m,使得 2^m >= n
         2,调用RANDOM(0,1),输出m-bit位整数N   (  N >= 0 and N <= 2^m-1)
         3,  if   N >=0  and N <= b-a
                      then return a+N     
                else 重新执行步骤 2
 
[a,b]之间每个数都是以 1/2^m 的概率输出的  

渐进运行时间分析:

我觉得渐进时间分析应该用概率分析的方法,我觉得是服从几何分布
     假设进行一系列伯努利试验,每次成功的概率是p,失败的概率是q=1-p,在取得一次成功前一共要进行多少次试验?令随机变量X为取得一次成功所要进行的试验次数,则X的取值范围{1,2,......}。对k>=1,因为在一次成功前有k-1次失败,从而有
                                               Pr[X=k]= q^(k-1)p
满足上式的分布称为几何分布     [见算法导论 P686]
在算法中 p=(b-a+1)/2^m   
期望运行次数(算法中生成m位序列的调用次数)为:  E[X]=sum(k*q^(k-1)p) [k=1......+无穷]=1/p=2^m/(b-a+1)
用T表示调用一次RANDOM(0,1)所需要的时间,每次运行时间为输出m位bit的时间:O(log(b-a) × T)
期望运行时间:O(T × log(b-a) × 2^m/(b-a+1) )=(约等于)O(T × log(b-a))  (因为m=(约等于)log(b-a+1))

posted @ 2015-10-23 22:36  夜雨寄北Ed  阅读(310)  评论(0编辑  收藏  举报