数据结构学习第一讲
-
- 计时c语言
- 多项式求值
计时c语言
通过利用clock()函数去计算函数运行所需要的时间以及比较两个函数所花费时间的大小比较。
1.clock()函数的返回值为clock_t类型
2.CLK_TCK为机器时钟每秒所走的时钟打点数
3.计算某个代码段所花费的时间
clock_t start,end;//clock_t是clock函数返回的变量类型
start = clock();
functin();
end=clock();
duration = ((double)(end-start))/CLK_TCK;
printf("ticks=%f\n",(double)(end-start));
printf("duration=%6.2e\n",duration);
多项式求值
f(x)=∑i=0nai?xi\sum_{i=0}^n a_i*x^i∑i=0n?ai??xi
1.对于该多项式进行求值,最简单的方式是直接转化为代码:
double f(int n,double a[],double x){double p=a[0];for(int i=1;i<=n;i++){p+=a[i]+pow(x,i);}return p;}
2.秦九韶给出了另一种方式,从后往前不断的提取x,然后求取总和
f(x)=a0+x(…(x(an-2+x(an-1+anx)))…)
double f2(int n,double a[],double x){double p=a[n];for(int i=n;i>0;i--){p=a[i-1]+p*x;}return p;}
3.比较这两种算法的所用时间的大小
#include<stdio.h>
#include<math.h>
#include<time.h>
#define MAXN 10
#define MAXK 1e7 //因为运行一次始终打点数小于1,所需时间还没到一秒,所以利用多次运行求平均的算出一次运行所需时间。
clock_t start,end;//clock_t是clock函数返回的变量类型
double duration;//统计函数运行的时间,以秒为单位
double f(int n,double a[],double x);
double f2(int n,double a[],double x);
void run(double(*f)(int ,double *,double ),double a[]);int main(void){double a[MAXN];for(int i=0;i<MAXN;i++){a[i]=(double)i;}//不在测试范围内的准备写在clock()之前 run(f,a);run(f2,a);}double f(int n,double a[],double x){double p=a[0];for(int i=1;i<=n;i++){p+=a[i]+pow(x,i);}return p;} double f2(int n,double a[],double x){double p=a[n];for(int i=n;i>0;i--){p=a[i-1]+p*x;}return p;}void run(double(*f)(int n,double *,double ),double a[]) //利用函数指针{int i;start = clock();for(int i=0;i<MAXK;i++)f(MAXN-1,a,1.1);end=clock();duration = ((double)(end-start))/CLK_TCK;printf("ticks=%f\n",(double)(end-start));printf("duration=%6.2e\n",duration);//科学计数法保留2位小数输出
}
运行结果:
从中可以看出第二种方式显然更加好,在这个过程中利用了函数指针
具体可以参考如下博主的这篇文章:函数指针的使用