当我们想出一个复杂度低算法时,如何对算法的准确性进行判断呢?使用对数器
方法:
- 你想要测试的方法a
- 觉得正确不考虑复杂度的算法b
- 产出随机样本
- 用b和a对样本进行处理
- 比对处理结果
- 反复进行3~5 当样本足够多时 可以认为正确
产生随机数的方法
- 使用rand函数配合srand
- 使用random库函数
说下第二种
头文件 < random >
static default_random_engine e(time(NULL));//产生随机数的引擎
static uniform_int_distribution <int> dis(1,40);//产生随机数,1~40是声明的范围
//int是指定声明类型
使用: 用uniform_int_distribution函数调用default_random_engine引擎范围值为设定的类型
如上 dis(e)返回值为int类型
注意:
- 随机数引擎e中的time(NULL)和srand中的作用一样为了产生不一样的种子数
- 如果是在一个调用的函数中反复使用以上方法来产生随机数,因加上static时其成为全局变量不然产生的随机数可能会一样。分析:若不设为全局变量,在栈中开辟空间,每次调用函数时创建随机数引擎,函数结束时释放,若反复调用函数,且系统允许速度足够快时,新建立的随机数引擎可能会和上次销毁的一样,随机数可以相同。这个问题在使用rand和srand来产生随机数时同样可能出现
使用举例:用归并法找数组中的最大数用对数器验证
#define _CRT_SECURE_NO_WARNINGS 2
//作者:蒋伟泉
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
using namespace std;
int Maxnum(vector<int>&obj,int left,int right){//归并法
if (left == right)
return obj[left];
int mid = (left + right) / 2;
int left_max = Maxnum(obj, left, mid);
int right_max = Maxnum(obj, mid+1, right);
return left_max > right_max ? left_max : right_max;
}
int Max_right(vector<int>&obj, int left, int right){//确保正确的方法
int max = obj[left];
for (int i = left + 1; i <= right; i++){
if (obj[i] > max)
max = obj[i];
}
return max;
}
void test(){
static default_random_engine e(time(NULL));
static uniform_int_distribution <int> dis(0,40);//随机数范围
int time = 5000;//测试次数 自己设定
int size = 0;//数组大小
int i = 0;
int j = 0;
for (i = 0; i < time; i++){
size = dis(e)+1;//随机数范围设为 0 ~ 40 加1保证数组不为空
vector<int>obj;
for (j = 0; j < size; j++){
obj.push_back(dis(e));
}
if (Max_right(obj, 0, obj.size() - 1) != Maxnum(obj, 0, obj.size() - 1)){
//判断结果不一样则直接退出
cout << "wrong" << endl;
break;
}
}
cout << "right" << endl;
}
int main()
{
test();
system("pause");
return 0;
}