MOOC 1.1 什么是数据结构

例1: printN

#include <cstdio> //void PrintN(int N) //{ // for(int i = 1; i <= N; ++ i) // { // printf("%d\n", i); // } // // return ; //} void PrintN(int N) { if(N) { PrintN(N - 1); printf("%d\n", N); } return ; } int main() { int n; scanf("%d", &n); PrintN(n); return 0; }

  

例二: 多项式

运行时间不到一个tick, 那怎么才能显示出一个tick所用的时间呢?(即如何测出不到1个tick的程序运行时间?)

让被测函数重复运行多次, 使得测出的总的时钟打点数间隔充分长, 最后计算出被测函数平均每次运行的时间即可

// f(x) = a0 + a1x + ... + an-1x^n-1 + anx^n

#include <cstdio>
#include <ctime>
#include <cmath>
#define MAXN 10		// 多项式最大项系数, 即多项式阶数+1
#define MAXK 1e7	// 被测函数最大重复调用次数 

double f1(int n, double a[], double x);
double f2(int n, double a[], double x);
void time(double (*f2)(int n, double a[], double x)); 

double a[MAXN];	// 存储多项式的系数

void time(double (*f2)(int n, double a[], double x)) 
{
	clock_t start, stop;
	double duration;
	start = clock();
	/* 重复调用函数以获得充分的时钟打点数 */ 
	for(int i = 0; i < MAXK; ++ i) 
	{
		f2(MAXN - 1, a, 1.1);
	}
	stop = clock();
	// 计算函数单次运行的时间 
	duration = ((double)(stop - start)) / CLK_TCK / MAXK;
	printf("ticks = %f\n", (double)(stop - start));
	printf("duration = %6.2e\n", duration);
}

double f1(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] + x * p;
	}
	return p;
}

int main()
{
	for(int i = 0; i < MAXN; ++ i)
	{
		a[i] = (double)i;
	} 
	
	time(f2);
	
	return 0;
}

/*
ticks = 1813.000000
duration = 1.81e-007

ticks = 297.000000
duration = 2.97e-008
*/

  

posted @ 2019-08-27 17:27  青衫客36  阅读(333)  评论(0编辑  收藏  举报