設代數式序列 $q_1(t), q_2(t), ..., q_{n-1}(t)$ ,由它們生成的多項式形式的表達式(不必定是多項式):算法
$$p(t)=x_1+x_2q_1(t)+...x_nq_1(t)q_2(t)..q_{n-1}(t)=\sum\limits_{i=1}^n(x_i\prod\limits_{j=1}^{i-1}q_j(t))$$ 通常來說,按照這個形式計算函數在 $t_0$ 點的取值的複雜度爲:n-1次 $q_i(t)$ 求值,n-1次浮點數乘法(生成n個不一樣的乘積),n-1次乘積和常係數浮點數乘法,n-1次浮點數加法 $\Rightarrow$ 總計n-1次 $q_i(t)$ 求值和 $T(n)\approx 3n$ 次浮點數運算。這須要在計算過程當中存儲保留一個 $\prod\limits_{j=1}^{i-1}q_j(t)$ 的結果,避免重複運算(那樣將會使得生成乘積的n次浮點乘法變成$n^2/2$ 次)。app
利用Horner嵌套算法,能夠在 $T(n)\approx 3n$ 的基礎上再進一步。Horner嵌套算法的表達式是:$$p(t)=x_1+q_1(t)(x_2+q_2(t)(x_3+q_3(t)(...(x_{n-1}+q_{n-1}(t)x_n)...)))$$ 迭代的僞代碼能夠寫成:函數
$poly = x_n\\for\quad i = n -1 to 1\\ \quad poly = x_i+q_i(t)\times poly\\ end$it
Horner嵌套算法須要n-1次 $q_i(t)$ 求值(這是免不了的),n-1次浮點數乘法,和n-1次浮點數加法,這將把複雜度再削減到n次求值和 $T(n)\approx 2n$ 次浮點數運算。考慮到函數求值是很是廣泛和基本的操做,即便只是在複雜度上打個折扣也是很是可觀的事情。所以形如上式的多項式型表達式,只要能夠使用Horner嵌套算法就應當使用。基礎
Horner嵌套算法適用於經過單項式表達的多項式求值,即 $p(t)=x_1+x_2t+x_3t^2+...+x_nt^{n-1}$ ,此處 $q_1(t)=q_2(t)=...=q_n(t)=t$;一樣也適用於經過牛頓插值表達的多項式,即 $p(t)=x_1+x_2(t-t_1)+...+x_n(t-t_1)..(t-t_n)$ ,此處 $q_i(t)=t-t_i$ 。im