您的位置:首页 > 其它

算法学习三:使用霍纳规则计算多项式

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日于深圳
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息