您的位置:首页 > 其它

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

2017-12-05 16:07 295 查看



5.1-2

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

伪代码:

[plain] view
plain copy

RANDOM(a, b)  

1   n = b - a + 1  

2   generate a new array A[1..<lgn>]  //<lgn>表示大于等于lgn的整数  

3   result = a - 1  //待返回的结果  

4   while t not belong to [a, b]  

5       for i = 1 to A.length  

6           A[i] = RANDOM(0, 1)  

7           result += A[i]x2^(A.length - i)  

8   return result  

代码实现:

[cpp] view
plain copy

#include <iostream>  

#include <stdlib.h>  

#include <time.h>  

#include <vector>  

#include <cmath>  

  

using namespace std;  

  

int RANDOM_0_1(void)  

{  

    return rand() % 2;  

}  

  

int RANDOM(int a, int b)  

{  

    unsigned int n = b - a + 1;  

    int num;  

    if(pow(2, (int)(log(n) / log(2))) == n)  

    {  

        num = log(n) / log(2);  

    }  

    else  

    {  

        num = (log(n) / log(2) + 1);    //向上取整  

    }  

    vector<int> A(num, 0);  

    int result = a - 1;  

    bool flag = true;  

    while(result < a || result > b)  

    {  

        if(flag)  

        {  

            result += 1;  

            flag = false;  

        }  

        for(int i = 0 ; i < A.size() ; ++i)  

        {  

            A[i] = RANDOM_0_1();  

            result += A[i]*pow(2, A.size() - i - 1);  

        }  

    }  

    return result;  

}  

  

int main()  

{  

    srand((unsigned)time(NULL));  

    for(int i = 0 ; i < 100 ; ++i)  

        cout << RANDOM(0, 7) << ", ";  

    cout << endl;  

  

    return 0;  

}  

运行结果:



运行时间分析:

我们假设当随机产生的数落入区间:[a, b]闭区间时为成功,概率为p,则:

,相反,失败时概率为1-p;程序中的while循环档出现一次成功时就结束循环,返回结果,令X表示从开始直到出现第一次成功的次数,X服从几何分布;由于几何分布的期望公式为:

,生成一个θ(log(b-a+1))维数组的时间为:θ(log(b-a));while循环中的内层循环的时间同样为θ(log(b-a)),而该内层循环的执行次数为X的期望次那么多,故函数整体期望运行时间为:θ(log(b-a))。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: