• 【算法】 算法效率


    问题:写程序计算给定多项式在给定点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;
    }
    

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

  • 相关阅读:
    获取Enum枚举值描述的几法方法
    Android开发入门 Button事件实现的方法(原创)
    最有价值的.Net第三方控件
    Eclipse快捷键大全(转载)
    recovery教程
    XP系统通过无线网卡共享宽带给其他设备,正确的共享设置(修正版,绝对可行)
    使用Eclipse写QT
    Android 4.0模拟器弹出“谷歌拼音输入法”已停止运行的解决方法
    C# 枚举用法总结
    谷歌安卓系统使用必读,什么是root, Recovery, Radio, APP TO SD, Rom
  • 原文地址:https://www.cnblogs.com/maxwell-maxwill/p/12301312.html
Copyright © 2020-2023  润新知