zoukankan      html  css  js  c++  java
  • [浙江大学数据结构]多项式求值,及算法效率问题

    代码:

    #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
    ",ret);
        printf("ticks%d=%f
    ",func_n,(double)(end-start));
        printf("duration%d=%6.2e
    ",func_n,duration);
    }

    运行结果:

    以上代码巧妙的运用了函数指针来托管方法的调用的开始以及结束,类似于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,差一个数量级

  • 相关阅读:
    闲扯 Javascript 01 实现选项卡
    控制台获得键盘事件
    C#反射 入门学习 02
    C#反射 入门学习 01
    闲扯 Javascript 00
    读张子阳老师的委托和事件 2
    浅析ado.net获取数据库元数据信息 DeriveParameters
    SQLBulkCopy使用
    利用CryptoStream进行加密解密
    vs 中代码的字体也颜色设置
  • 原文地址:https://www.cnblogs.com/passedbylove/p/12148400.html
Copyright © 2011-2022 走看看