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

霍納規則中的算法思想

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

簡介

百度百科介紹,霍納規則用來簡化樸素多項式的求值,在中國叫秦九韶算法。霍納規則是一種將一元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日於深圳

發佈了47 篇原創文章 · 獲贊 90 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章