《算法导论》学习笔记之Chapter5.1

5.1-2

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

伪代码:

[plai n]  view plain  copy
  1. RANDOM(a, b)  
  2. 1   n = b - a + 1  
  3. 2   generate a new array A[1..<lgn>]  //<lgn>表示大于等于lgn的整数  
  4. 3   result = a - 1  //待返回的结果  
  5. 4   while t not belong to [a, b]  
  6. 5       for i = 1 to A.length  
  7. 6           A[i] = RANDOM(0, 1)  
  8. 7           result += A[i]x2^(A.length - i)  
  9. 8   return result  
代码实现:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <stdlib.h>  
  3. #include <time.h>  
  4. #include <vector>  
  5. #include <cmath>  
  6.   
  7. using namespace std;  
  8.   
  9. int RANDOM_0_1(void)  
  10. {  
  11.     return rand() % 2;  
  12. }  
  13.   
  14. int RANDOM(int a, int b)  
  15. {  
  16.     unsigned int n = b - a + 1;  
  17.     int num;  
  18.     if(pow(2, (int)(log(n) / log(2))) == n)  
  19.     {  
  20.         num = log(n) / log(2);  
  21.     }  
  22.     else  
  23.     {  
  24.         num = (log(n) / log(2) + 1);    //向上取整  
  25.     }  
  26.     vector<int> A(num, 0);  
  27.     int result = a - 1;  
  28.     bool flag = true;  
  29.     while(result < a || result > b)  
  30.     {  
  31.         if(flag)  
  32.         {  
  33.             result += 1;  
  34.             flag = false;  
  35.         }  
  36.         for(int i = 0 ; i < A.size() ; ++i)  
  37.         {  
  38.             A[i] = RANDOM_0_1();  
  39.             result += A[i]*pow(2, A.size() - i - 1);  
  40.         }  
  41.     }  
  42.     return result;  
  43. }  
  44.   
  45. int main()  
  46. {  
  47.     srand((unsigned)time(NULL));  
  48.     for(int i = 0 ; i < 100 ; ++i)  
  49.         cout << RANDOM(0, 7) << ", ";  
  50.     cout << endl;  
  51.   
  52.     return 0;  
  53. }  
运行结果:


运行时间分析:

我们假设当随机产生的数落入区间:[a, b]闭区间时为成功,概率为p,则:,相反,失败时概率为1-p;程序中的while循环档出现一次成功时就结束循环,返回结果,令X表示从开始直到出现第一次成功的次数,X服从几何分布;由于几何分布的期望公式为:,生成一个θ(log(b-a+1))维数组的时间为:θ(log(b-a));while循环中的内层循环的时间同样为θ(log(b-a)),而该内层循环的执行次数为X的期望次那么多,故函数整体期望运行时间为:θ(log(b-a))。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值