算法的时间复杂度比较,计算多项式的直接法和秦九韶法

1.直接法:

1 double Polynomial_1(int n, double a[], double x)
2 {
3     int i;
4     double sum = 0;
5     for (i = 0; i < n; i++)
6         sum += a[i] * pow(x, i);
7     return sum;
8 }

每次循环迭代,pow函数内部都会执行i次乘法,然后一次加法,所以整体的算法复杂度为O = 1/2 * n ^ 2 + 3/2n,尽管pow函数的实现方法是利用递归优化后的,但是算法复杂度还是达到了O(nlogn)

2.秦九韶法:

1 double Polynomial_2(int n, double a[], double x)
2 {
3     int i;
4     double sum = 0;
5     for (i = n; i > 0; i--)
6         sum = a[i - 1] + x * sum;
7     return sum;
8 }

它不断提取公因式x来减少乘法的运算次数,算法复杂度为O(n);

下面介绍一个测试运行时间的函数

clock()函数可以捕捉从程序开始运行到clock()被调用时所打下的点数,在要测试的函数前后各放置一个clock()函数,利用两个clock()函数即可计算出执行一个函数所打下的点数,CLK_TCK(或者是CLOCKS_PER_SEC)是一个常量,表示一个机器时钟每秒钟所打下的点数,简单计算后即可得到测试函数的运行时间,但是因为一个函数的运行时间是在是太短了,短到时钟还来不及打下下一个点函数就运行结束了,所以我们让被测函数重复循环多次执行,即可得到特定次数下的运行时间,被测函数的运行时间的比较就可以实现了。

 1 void run(double(*f)(int, double*, double), double a[], int case_n)
 2 {
 3     //此函数用于测试被测函数(*f)的运行时间,并且根据case_n输出相应的结果
 4     //case_n是输出的函数编号,1代表Polynomial_1, 2代表Polynomial_2
 5     int i;
 6     start = clock();                //开始计时
 7     for (i = 0; i < MAXK; i++)        //重复调用函数已获得充分多的时钟打点数
 8         (*f)(MAXN, a, 1.1);
 9     stop = clock();                    //结束计时
10     duration = ((double)(stop - start)) / CLK_TCK;        //计算运行时间
11     printf("ticks %d = %f\n", case_n, (double)(stop - start));
12     printf("duration 1 = %6.2e\n", duration);
13 }

下面是主函数,设置了多项式的各项系数

 1 #include <stdio.h>
 2 #include <time.h>
 3 #include <math.h>
 4
 5 clock_t start, stop;
 6 double duration;        //记录被测函数运行的时间,以秒为单位
 7 #define MAXN 10            //多项式最大项数,最大项数加1
 8 #define MAXK 1e4    //被测函数最大重复调用次数
 9
10 int main()
11 {
12     int i;
13     double a[MAXN];
14     for (i = 0; i < MAXN; i++)    //设置多项式的各项系数
15         a[i] = (double)i;
16
17     run(Polynomial_1, a, 1);
18     run(Polynomial_2, a, 2);
19     return 0;
20
21 }

根据MAXK设置不同的值,让被测函数重复循环执行相应的次数,实验结果如下

10^4:  10^5:

10^6:   10^7:

由实验结果可以看出,秦九韶算法几乎都比普通算法快一个数量级

原文地址:https://www.cnblogs.com/hi3254014978/p/9707051.html

时间: 2024-10-10 14:34:29

算法的时间复杂度比较,计算多项式的直接法和秦九韶法的相关文章

【数据结构与算法】时间复杂度的计算

算法时间复杂度的计算 [整理] 博客分类: 算法学习 时间复杂度算法 基本的计算步骤  时间复杂度的定义     一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度. 根据定义,可以归纳出基本的计算步骤 1. 计算出基本操作的执行次

关于算法的时间复杂度怎么计算

参考 [*][https://blog.csdn.net/user11223344abc/article/details/81485842][时间复杂度O(logN),比如二分法就是时间复杂度O(log2N) 递归也是O(log2N)] [https://blog.csdn.net/qq_36582604/article/details/81661236] [https://baijiahao.baidu.com/s?id=1609024533531824968&wfr=spider&fo

《时间复杂度的计算》

一:为什么要计算时间复杂度? - 一说起时间复杂度,就和算法扯上了关系,那么就有了一个问题,在我们写好了一个算法之后,如何测试这个算法的好或者不好呢? - 事后统计法,指的是在算法完成之后,通过实际的运行来检验算法的好坏.但是,这样也有两个致命的缺点 - 如果算法不行,那么我们实际运行图了个什么? - 机器性能一会好一会不行怎么破? - 因为 事后统计法 的不靠谱,所以我们采用了 事前分析 的方法,也就是我们说的 时间复杂度. - 不过因为是事前统计,其算法本身也并没有通过实际环境的检验. - 

简单算法学习之时间复杂度的计算

例如 for(int i=0;i<n;++i){ for(int j=0;j<m;++j) a++; //注意,这里计算一次的时间是1.}那么上面的这个例子的时间复杂度就是 m*n再例如冒泡排序的时间复杂度是N*N:快排的时间复杂度是log(n) 二.计算方法 1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例

算法时间复杂度的计算 [整理]

基本的计算步骤 时间复杂度的定义 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度. 根据定义,可以归纳出基本的计算步骤 1. 计算出基本操作的执行次数T(n) 基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语

算法的时间复杂度计算

参考自:此文 一.循环执行次数的计算 1.双重循环 for(int i=1;i<=n;i++) // 外层n次 for(int j=1;j<=i;j++) // 内层i次 f(); 总次数=1+2+3+..+n=(1+n)*n/2 时间复杂度=O(n^2) 2.三重循环 for(int i=1;i<=n;i++) // 外层n次 for(int j=1;j<=i;j++) // 内层为双重循环,执行次数为(1+i)*i/2=i^2/2+i/2 for(int k=1;k<=j

常用排序算法之--时间复杂度计算

本篇博文非博主原创,系通过度娘收集整理而来,如有雷同,请联系博主,追加上转载出处.同时博主水平和理解有限,如有什么偏差请广大博友指定. 学习交流qq:792911374 时间复杂度 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.一个算法的时间开销记作:T(n),其中n表示算法的基本操作模块被重复执行的次数.算法的时间复杂度记做T(n)=O(f(n)),随着n的增大,算法执行时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高.时

多种方式计算多项式a0+a1*x+a2*x^2+a3*x^3+.......(计算效率与算法的重要性)

问题描述: 两种方式计算多项式a0+a1*x+a2*x^2+a3*x^3+.......(普通算法以及秦九韶算法)在某处x的值,通过调用<time.h>中的函数tick(),计算两种方式的运算时间,得出.....预知结论为何,请看下面代码: 代码如下: #include<stdio.h> #include<math.h> //pow #include<time.h> //tick #define MAXODER 300 //最大阶乘数 #define REP

转 算法时间复杂度的计算 [整理]

来自 http://univasity.iteye.com/blog/1164707 基本的计算步骤  时间复杂度的定义     一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度. 根据定义,可以归纳出基本的计算步骤 1. 计算出