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
*/

浙公网安备 33010602011771号