淺談秦九韶算法


淺談秦九韶算法

本篇隨筆簡單講解一下高中數學必修三信息學奧林匹克競賽中的秦九韶算法。

秦九韶算法的應用

求下式在\(x\)為定值時的值:

\[f(x)=a_0+a_1x+a_2x^2+a_3x^3+\cdots+a_nx^n \]

一開始面對這個東西,我們最早想到的可能是暴力算法:直接帶進去乘法求值。

那還要秦九韶發明這個算法干什么

那么就隆重介紹秦九韶算法。

簡單來講就是提公因式。

原式可以變形成為:

\[f(x)=a_0+x(a_1+a_2x+a_3x^2+\cdots+a_nx^{n-1}) \]

繼續提:

\[f(x)=a_0+x(a_1+x(a_2+a_3x+\cdots+a_nx^{n-2})) \]

以此類推...

最后提完之后就成為了這樣的式子:

\[f(x)=(\cdots(a_nx+a_{n-1})x+a_{n-2})x+\cdots+a_1)x+a_0 \]

乍一看很復雜,其實很簡單(能入選高中課本的算法怎么可能難)

那么它比暴力算法優秀在哪呢?

想一下,以一個這樣的式子為例:

計算下式的值:

\[f(x)=x^5+x^4+x^3+x^2+x+1\quad (x=5) \]

暴力算法就可以一個一個進行乘法和加法。

那么:

我們可以發現,進行了10次乘法(暴力計算\(x^n\)需要\(n-1\)次乘法運算),和5次加法。

而秦九韶算法並沒有改變加法的運算量(因為加號是無論如何消除不掉的),但是乘法呢?我們仔細觀察一下就可以發現,最后提出來了4個5,也就是說僅僅需要進行4次的乘法運算。這種效率顯然是更優的,而且最高此項的次數越大,效率優化越高。

秦九韶算法的代碼實現:

秦九韶算法的實現只是一個模擬算法的過程。假設\(a[i]\)數組輸入了從多項式在次數為\(i\)那項的系數,那么秦九韶算法的核心代碼塊就是:

void qinjiushao()
{
    for(int i=n-1;i>=1;i--)
        ans*=x,ans+=a[i];
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM