算法导论 5.1-2

1 题目

描述RANDOM(a,b)过程的一种实现,它只调用RANDOM(0,1)。作为a和b的函数,你的程序的期望运行时间是多少?

2 分析与解答

RANDOM(0,1)以等概率生成0或1,将区间[a,b]中的整数以2进制表示就可以只用0和1来表示区间中的任意数,再设[a,b]中的整数有n位,那么使用RANDOM(0,1)就可以生成n位二进制整数的全集,而区间[a,b]中的整数是n位二进制整数的一个子集,所以RANDOM(0,1)可以生成[a,b]中所有的整数。并且由于每位生成0或1的概率是相同的,且每位生成0或1是相互独立的,所以生成的[a,b]之间的每个整数的概率是相等的,满足RANDOM(a,b)的要求。

综上,RANDOM(a,b)只调用RANDOM(0,1)的一种实现步骤是:

  1. 计算b的二进制表示的位数,表示为n
  2. 使用RANDOM(0,1)生成n位二进制数
  3. 若生成的数在[a,b]则返回,若不再区间则递归调用RANDOM(a,b)

2.1 伪代码

RANDOM(a,b)
    n = compute the bits of b
    c = 0
    for i <- 1 to n
        do c = c +  (RANDOM(0,1) << (i-1))
    if a <= c and c <= b
        then return c
    return RANDOM(a,b)

2.2 python实现

import random
def myrandom(a,b):
    n = 1
    c = 0
    tmp = b
    while tmp/2 > 0:
        tmp = tmp/2
        n += 1
    for i in range(0,n):
        c += (random.randint(0,1) << i)
    if a <= c and c <= b:
        return c
    return myrandom(a,b)

将b的位数n作为衡量运行时间的变量。那么每次有返回的概率是(b-a)/2 n,这是个贝努力实验,分布符合几何分布,所以期望为2 n/(b-a),所以期望的运行时间为T(n)=T random(0,1)(n)*2 n/(b-a)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值