【算法】 算法效率

问题:写程序计算给定多项式在给定点x处的值。

最简单无脑的写法。直接带入(f(x)=a_0+a_1x+a_2x^2+...+a_nx^n),循环,一项一项地加即可。

#include <iostream>
#include "math.h"
double f(int n, double a[],double x);

int main(){
    int n=3;
    double a[4]={1,1,1,1};
    double x=1;
    
    std::cout<< f(n, a, x);
    return 0;
}

double f(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;
}

秦九韶算法。(f(x)=a_0+x(a_1+x(...(a_{n-1}+x(a_n))...)))。从最后一个系数开始乘

#include <iostream>
#include "math.h"
double f(int n, double a[],double x);

int main(){
    int n=3;
    double a[4]={1,1,1,1};
    double x=1;
    
    std::cout<< f(n, a, x);
    return 0;
}

double f(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;
}

使用clock() 常数CLK_TCK:机器始终每秒所走的时钟打点数

#include <iostream>
#include <time.h>

clock_t start, stop;
/*clock_t是clock()函数返回的变量类型*/
double  duration;
/*记录被测函数运行时间,以秒为单位*/
int main(){
    start = clock( );
    MyFunction();
    stop=clock();
    duration =((double)(stop-start))/CLK_TCK;
}


测试程序:

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

double f1(int n, double a[], double x);
double f2(int n, double a[], double x);
#define MAXN 10
#define MAXK 1000000

clock_t start, stop;
/*clock_t是clock()函数返回的变量类型*/
double  duration;
/*记录被测函数运行时间,以秒为单位*/
int main(){
    int i;
    double a[MAXN];
    for(i=0;i<MAXN;i++) a[i]=(double)i;
    
    start = clock( );
    for(int i=1;i<MAXK;i++)
    f1(MAXN, a, 1.1);
    stop=clock();
    duration =((double)(stop-start))/CLK_TCK;
    std::cout<<duration<<std::endl;
    
    start = clock( );
    for(int i=1;i<MAXK;i++)
    f2(MAXN, a, 1.1);
    stop=clock();
    duration =((double)(stop-start))/CLK_TCK;
    std::cout<<duration<<std::endl;

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

运行结果差一个数量级。解决问题方法的效率和算法的巧妙程度有关。

原文地址:https://www.cnblogs.com/maxwell-maxwill/p/12301312.html