算法导论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))