[浙江大学数据结构]多项式求值,及算法效率问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[浙江大学数据结构]多项式求值,及算法效率问题相关的知识,希望对你有一定的参考价值。

[浙江大学数据结构]多项式求值,及算法效率问题_数据结构

 

 

代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
clock_t start, end;
/*clock_t 是clock()函数返回的变量类型*/
double duration;
/*被测函数运行时间,以秒为单位*/
#define MAXN 101 /* 多项式最大项数,即多项式次数+1 */
#define MAXK 1e5 /* 被测函数最大重复调用次数 */
double f1(int n, double a[], double x);
double f2(int n, double a[], double x);
void run(double(*f)(int, double *, double), double a[], int func_n);
int main(int argc, char const *argv[])

int i;
double a[MAXN]; /* 存储多项式系数 */
a[0] = 1;

for (i = 1; i < MAXN; ++i)

a[i] = (double)(1.0/i);



run(f1, a, 1);

run(f2, a, 2);

return 0;


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));


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;

return p;


void run(double(*f)(int, double *, double), double a[], int func_n)

int i;

double ret;

start = clock();

for (i = 0; i < MAXK; ++i)

ret = f(MAXN - 1, a, 1.1);


end = clock();

/* 常数CLK_TCK:机器时钟每秒所走的时钟打点数 */
duration = ((double)(end - start)) /CLK_TCK;

printf("result:%lf\\n",ret);
printf("ticks%d=%f\\n",func_n,(double)(end-start));
printf("duration%d=%6.2e\\n",func_n,duration);

 

运行结果:

[浙江大学数据结构]多项式求值,及算法效率问题_#define_02

 

 

 

 

 

以上代码巧妙的运用了函数指针来托管方法的调用的开始以及结束,类似于Java中方法的拦截器,在执行前执行后

可以执行一些动作。转载自:​​https://github.com/callmePicacho/Data-Structres/blob/master/%E4%B8%8A%E8%AF%BEDemo/1.%E8%AE%A1%E6%97%B6%E5%AE%9E%E4%BE%8B.c​

 结论

测试过程中,f1,f2函数分别运行了1e5次方,即10万次

f1运行10万次使用729毫秒

f2运行10万次使用64毫秒

算法f2优于f1,差一个数量级

以上是关于[浙江大学数据结构]多项式求值,及算法效率问题的主要内容,如果未能解决你的问题,请参考以下文章

@算法 - 4@ 多项式的多点求值与快速插值

多项式求值的秦九韶算法 python

多项式函数插值:多项式形式函数求值的Horner嵌套算法

多项式求值的MATLAB实现

MATLAB编程及应用-第5章 多项式与数据分析

解题报告多项式求值与插值(拉格朗日插值)(ACM / OI)