数据结构——MOOC

刚开始学陈越老师和何钦铭老师的数据结构网课,下列题目为陈越老师的课上例题

不足之处还请指正

计算多项式

此处以此为例:

//初始写法: 

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:两段重复代码可以写一个函数,但本人太懒,没写

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值