1. 程式人生 > >演算法學習三:使用霍納規則計算多項式

演算法學習三:使用霍納規則計算多項式

霍納規則中的演算法思想

在《演算法導論》第二章的思考題中,描述了利用霍納規則計算多項式的方法。以前自己在寫程式的時候都是傻傻的簡單粗暴地直接上了,看到這個演算法的時候眼前一亮,就多看了一些,果然要比直接計算要效率高很多。為了防止自己以後忘了這個高效的演算法,在此記錄一下。

簡介

百度百科介紹,霍納規則用來簡化樸素多項式的求值,在中國叫秦九韶演算法。霍納規則是一種將一元n次多項式的求值問題轉化為n個一次式的演算法。其大大簡化了計算過程,即使在現代,利用計算機解決多項式的求值問題時,霍納規則依然是最優的演算法規則

直接迭代計算多項式

既然是最優的演算法規則,我們可以根據它的計算過程來分析為何它會簡化原來的計算過程。一般多項式的表示式如下:

P(n)=k=0nakxk=a0+x(a1+x(a2+...+x(an1+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(an1+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日於深圳