个人笔记——数据结构与算法初体验1

这篇博客探讨了如何使用C语言计算100阶多项式在x=1.1处的值,对比了两种方法:通过math.h的pow函数和多项式拆分递归计算。文章强调了正确初始化数组和避免错误的重要性,并通过分析了两种方法的运行效率,结果显示第二种方法的性能更优。
摘要由CSDN通过智能技术生成

给定另一个100阶多项式,用不同方法计算 x 在 1.1 的值:
在这里插入图片描述

在开始之前,先理一下思路,主要有两种方式:
1.使用math.h中的pow,通过for循环一次计算
2.通过多项式拆分,从最内部向外计算,例如先计算1/99+x/100的值再依次向外延伸

为实现以上两个方法,并分别验证它们的运行效率,需要用到<time.h>中的clock_t,以及CLK_TCK,完整代码如下:

#include <stdio.h>
#include <math.h>
#include <time.h>

#define MAXN 100
#define MAXK 1e6
#define VX 1.1

'''定义了几个量,便于修改,分别代表阶数、循环次数,变量x的值'''
// 定义方法变量
typedef double (*p)(int n, double a[], double x);

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

// 此处的p调用了上方定义的方法变量
void time_count(p func, int n, double a[], double x, int m);

// 定义clock的类型,用于计算程序运行时间
clock_t start, stop;
double duration;

int main(){
	int i;
	double a[MAXN];
	// 获取系数列表
	for ( i=0;i<=MAXN;i++) a[i] = 1/(double) i;
	a [0] = 1;
	time_count(f1, MAXN, a, VX, MAXK);
	time_count(f2, MAXN, a, VX, MAXK);
	
	
	return 0;
}

void time_count(p func, int n, double a[], double x, int m){
	double p;
	int i;
	start = clock();
	// 循环1000000次,计算平均运行速度
	for ( i=0;i<m;i++) p = func(n, a, x);
	stop = clock();
	duration = (double)(stop - start) / CLK_TCK / m;
	printf("ticks1 = %f\n", (double)(stop - start) / m);
	printf("duration1 = %6.2e\n", duration);
}

double f1(int n, double a[], double x){
	int i;
	double p = a[0];
	for ( i=1; i<=n; i++){
		p += a[i]*pow(x, i);
	}
//	printf("f1: %.2f\n", p);
	return p;
}

double f2(int n, double a[], double x){
	int i;
	double p = a[n];
	for ( i=n;i>0;i--){
		p = a[i-1] + x*p;
	}
//	printf("f2: %.2f\n", p);
	return p;
}

注:MOOC讨论区中其实很多答案不正确,主要体现在a[ ] 数列的值上,需要取到MAXN才对,同时需要对a[0]的值进行初始化,不然a[0]=1/0,为无限大,使得运行结果始终为 1.#J
最终结果:
在这里插入图片描述
可见方法2比方法1快了一个量级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值