刚开始学陈越老师和何钦铭老师的数据结构网课,下列题目为陈越老师的课上例题
不足之处还请指正
计算多项式
此处以此为例:
//初始写法:
double f1(int n,double a[],double x){
int i;
double p=a[0];
for(i=1;i<n+1;i++){
p+=(a[i]*pow(x,i));
}
return p;
}
//改进写法:
// 通过化简化为:f(x)=a0 + x(a1 + x(……(a(n-1) + x(an))……))
double f2(int n,double a[],double x){
int i;
double p=a[0];
for(i=n;i>0;i--){
p=a[i-1]+x*p;
}
return p;
}
那么为什么要选取第二种改进写法呢?
——>可以比较一下两种函数运行的时间
这里采用下面的方法计算运行时间
clock_t start,stop; /*clock_t是clock()函数返回的变量类型*/
double duration; /*记录被测函数的运行时间,以秒为单位*/
int main()
{
start=clock(); //开始计时
MyFounction(); //把被测函数加在这里
stop=clock(); //停止运行
duration=((double)(stop-start))/CLK_TCK//计算单次运行时间
printf("ticks=%f\n",(double)(stop-start));
printf("duration=%6.2e\n",duration);
/*其他不在测试范围的的处理写在后面,例如输出duration的值*/
}
完整代码如下:
#include <stdio.h>
#include <time.h>
#include <math.h> //后面用到pow函数
clock_t start,stop; /*clock_t是clock()函数返回的变量类型*/
double duration; /*记录被测函数的运行时间,以秒为单位*/
#define MAXN 10 //多项式最大项数,即多项书阶数+1
double f1(int n,double a[],double x);
double f2(int n,double a[],double x);
int main()
{
int i;
double a[MAXN];//存储多项式的系数
for(i=0;i<MAXN;i++){
a[i]=(double)i;
}
/*不在测试范围的函数的准备工作写在clock()调动之前*/
start=clock();//开始计时
f1(MAXN-1,a,1.1); //把被测函数加在这里
stop=clock();//停止运行
duration=((double)(stop-start))/CLK_TCK;//计算单次运行时间
printf("ticks1=%f\n",(double)(stop-start));
printf("duration=%6.2e\n",duration);
/*其他不在测试范围的的处理写在后面,例如输出duration的值*/
start=clock();//开始计时
f2(MAXN-1,a,1.1); //把被测函数加在这里
stop=clock();//停止运行
duration=((double)(stop-start))/CLK_TCK;//计算运行时间
printf("ticks2=%f\n",(double)(stop-start));
printf("duration=%6.2e\n",duration);
return 0;
}
double f1(int n,double a[],double x){
int i;
double p=a[0];
for(i=1;i<n+1;i++){
p+=(a[i]*pow(x,i));
}
return p;
}
double f2(int n,double a[],double x){
int i;
double p=a[0];
for(i=n;i>0;i--){
p=a[i-1]+x*p;
}
return p;
}
但是我们发现结果均为0
为什么呢?——因为函数运行太快了,不足一个tick
那么如何解决呢?——可以通过重复运行函数,直至时间足以计算,然后除以重复次数,得到平均时间
#include <stdio.h>
#include <time.h>
#include <math.h>
clock_t start,stop; /*clock_t是clock()函数返回的变量类型*/
double duration; /*记录被测函数的运行时间,以秒为单位*/
#define MAXN 10 //多项式最大项数,即多项书阶数+1
#define MAXK 1e7 //被测函数的重复调用次数
double f1(int n,double a[],double x);
double f2(int n,double a[],double x);
int main()
{
int i;
double a[MAXN];//存储多项式的系数
for(i=0;i<MAXN;i++){
a[i]=(double)i;
}
/*不在测试范围的函数的准备工作写在clock()调动之前*/
start=clock();//开始计时
for(i=0;i<MAXK;i++){
f1(MAXN-1,a,1.1); //把被测函数加在这里
}
stop=clock();//停止运行
duration=((double)(stop-start))/CLK_TCK/MAXK;//计算单次运行时间
printf("ticks1=%f\n",(double)(stop-start));
printf("duration1=%6.2e\n",duration);
/*其他不在测试范围的的处理写在后面,例如输出duration的值*/
start=clock();//开始计时
for (i=0;i<MAXK;i++){
f2(MAXN-1,a,1.1); //把被测函数加在这里
}
stop=clock();//停止运行
duration=((double)(stop-start))/CLK_TCK/MAXK;//计算运行时间
printf("ticks2=%f\n",(double)(stop-start));
printf("duration2=%6.2e\n",duration);
return 0;
}
double f1(int n,double a[],double x){
int i;
double p=a[0];
for(i=1;i<n+1;i++){
p+=(a[i]*pow(x,i));
}
return p;
}
double f2(int n,double a[],double x){
int i;
double p=a[0];
for(i=n;i>0;i--){
p=a[i-1]+x*p;
}
return p;
}
PS:两段重复代码可以写一个函数,但本人太懒,没写