《算法导论》学习笔记之Chapter5.1
2017-12-05 16:07
295 查看
问题:请描述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))。
相关文章推荐
- 《算法导论》学习笔记之Chapter 2-2.1,2.2,2.3插入排序,选择排序,归并排序
- 《算法导论》学习笔记之Chapter13红黑树
- 《算法导论》学习笔记之Chapter10基本数据结构---栈的数组实现
- 《算法导论》学习笔记之Chapter8线性时间排序
- 《算法导论》学习笔记之Chapter12二叉树基本特点,及二叉搜索树(查找树)
- 《算法导论》学习笔记之Chapter9中位数和顺序统计量
- 《算法导论》学习笔记之Chapter4.2矩阵乘法Strassen
- 《算法导论》学习笔记——插入排序
- 算法导论(CLRS, 2nd) 个人答案 Ch2 end of chapter
- 算法导论-5.1-2
- 《算法导论》— Chapter 9 中位数和顺序统计学
- 《算法导论》— Chapter 11 散列表
- 《算法导论》学习笔记:1.算法在计算中的应用
- 《算法导论》— Chapter 15 动态规划
- 《算法导论》之 Problem 5.1-3(随机函数发生器的设计)
- 《算法导论》学习笔记—算法基础
- C++ Primer 5th Chapter 6 学习笔记
- 查找数组第i小的数-《算法导论》学习笔记十
- chapter 5.1: object model介绍
- 《算法导论》习题解答 Chapter 22.1-6(求universal sink 通用汇点)