算法学习三:使用霍纳规则计算多项式
2016-07-10 11:33
543 查看
霍纳规则中的算法思想
在《算法导论》第二章的思考题中,描述了利用霍纳规则计算多项式的方法。以前自己在写程序的时候都是傻傻的简单粗暴地直接上了,看到这个算法的时候眼前一亮,就多看了一些,果然要比直接计算要效率高很多。为了防止自己以后忘了这个高效的算法,在此记录一下。简介
据百度百科介绍,霍纳规则用来简化朴素多项式的求值,在中国叫秦九韶算法。霍纳规则是一种将一元n次多项式的求值问题转化为n个一次式的算法。其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,霍纳规则依然是最优的算法规则。
直接迭代计算多项式
既然是最优的算法规则,我们可以根据它的计算过程来分析为何它会简化原来的计算过程。一般多项式的表达式如下:P(n)=∑k=0nakxk=a0+x(a1+x(a2+...+x(an−1+xan)))
最简单直接的计算方法就是直接迭代计算相加,其伪代码如下:
sum=0 for k<---0 to n sum<---sum+ak*x^k
对于每个k,假设计算机的计算幂的时候是采用元素多次相乘,则sum+akxk的计算复杂度为k+2(假设加法和乘法指令的时间一样,下同),总的计算时间为
T(n)=c1n+c2(2+3+...+(n+2))=c1n+c2n(n+4)2
即直接计算的时间复杂度为θ(n2)。
霍纳规则计算多项式
霍纳规则采用的是最少乘法策略,它通过巧妙的结构分解,避免了一次次计算幂的过程,简化了乘法计算数目,大大提高了计算效率。再次看一下多项式进行结构分解后的形式:P(n)=∑k=0nakxk=a0+x(a1+x(a2+...+x(an−1+xan)))
霍纳规则的伪代码如下:
y<---0 for k<---n to 0 do y<---ak+x*y
此时,对于每个k,其计算的时间复杂度为2,则霍纳规则计算多项式的总时间为:
T(n)=c1n+c2×2×n=(c1+2c2)n
即霍纳规则计算多项式的时间复杂度为θ(n)。
显然,θ(n)要远远优于θ(n2)。虽然这只是一个小小的例子,但足以体现出算法思想的力量,以后再写程序决不能蒙着脑袋上去就写了,还真是要好好琢磨一下呢。
祝枫
2016年7月10日于深圳
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 如何高效的使用内存
- C#算法之大牛生小牛的问题高效解决方法
- 高效的mysql分页方法及原理
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 开源MySQL高效数据仓库解决方案:Infobright详细介绍
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解