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

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

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:1456655-20180926150511312-1856526700.png    

10^5:   1456655-20180926150559275-1718566692.png

10^6:1456655-20180926150631684-473776507.png

10^7:1456655-20180926150657096-1375974209.png

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

相关文章
|
4天前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
23 6
|
4天前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
20 0
|
2月前
|
机器学习/深度学习 算法 程序员
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。
60 2
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
|
2天前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
10 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
9天前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
12 0
算法的时间复杂度和空间复杂度
|
24天前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
36 4
|
9天前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
21天前
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
1月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
2月前
|
机器学习/深度学习 存储 算法
算法时间复杂度分析
这篇文章讲解了如何分析算法的时间复杂度,包括关注循环执行次数最多的代码段、总复杂度的确定、嵌套代码复杂度的计算方法,并提供了大O阶的推导步骤和常见时间复杂度的列表,同时还介绍了空间复杂度的概念及其重要性。