首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

多項式計算效率對比:庫函數 pow() vs 秦九韶算法(Horner 規則)C++ 實測

     編輯:PHP 相關知識

多項式計算效率對比:庫函數 pow() vs 秦九韶算法(Horner 規則)C++ 實測

計算多項式 f(x) = 1 + Σ(xi/i) (i=1..m) 時,直接調用 pow() 與使用秦九韶算法(Horner 規則)的性能差距驚人。本文通過 C++ 實測數據,直觀展示算法優化的威力。

一、兩種算法實現

1. 直接調用 pow()

double Fn1(double x) {
  double f = 1.0;
  for (int i = 1; i <= m; i++) {
    f += pow(x, i) / i; // 每次調用 pow,重複計算 x^i
  }
  return f;
}

2. 秦九韶算法(遞推結構)

double Fn2(double x) {
  double f = 0.0;
  for (int i = m; i >= 1; i--) {
    f = f * x + 1.0 / i; // 利用上一次結果,僅一次乘法
  }
  return f * x + 1.0;
}

原理:f(x) = 1 + x/1 + x²/2 + ... + xm/m 重寫為遞推形式,消除冪次運算。

二、測試環境與代碼

  • 編譯器:GCC / MSVC Release 模式
  • 輸入:x = 0.9,m 從 100 到 109
  • 計時:clock() 精度約毫秒
#include 
#include 
#include 
#define m 1000000000 // 修改此處測試不同規模
using namespace std;
double Fn1(double x); double Fn2(double x);
int main() {
  double x = 0.9;
  clock_t start, stop;
  start = clock(); cout << Fn1(x) << endl; stop = clock();
  cout << "Fn1 time: " << double(stop-start)/CLOCKS_PER_SEC << "s" << endl;
  start = clock(); cout << Fn2(x) << endl; stop = clock();
  cout << "Fn2 time: " << double(stop-start)/CLOCKS_PER_SEC << "s" << endl;
  return 0;
}

三、實測數據對比表

m (項數)Fn1 pow() 耗時Fn2 秦九韶 耗時加速比
1000.001s0.000s—
1,0000.001s0.000s—
10,0000.003s0.000s—
100,0000.015s0.001s15x
1,000,0000.157s0.005s31x
10,000,0001.619s0.049s33x
100,000,00017.955s0.472s38x
1,000,000,000191.608s4.706s41x

四、複雜度分析

秦九韶算法將指數運算降維為線性遞推,隨 m 增長優勢指數級擴大。

五、工程啟示

  1. 算法選型決定性能上限:同樣硬件,O(m) vs O(m log m) 差距 40 倍。
  2. 數學重構威力:多項式、級數求和、動態規劃轉移常可通過遞推消除冗餘計算。
  3. 庫函數非銀彈:pow() 通用但昂貴,熱路徑務必檢查是否可替換為增量計算。
  4. 數值穩定性:秦九韶算法從高次向低次遞推,對浮點數累積誤差控制優於正向求和。

這個發現於宋代(秦九韶《數書九章》1247年)的算法,至今仍是計算機科學教科書級的優化典範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
算法時間複雜度空間複雜度關鍵操作
pow() 直接求和O(m · log i) ≈ O(m log m)O(1)每項調用 pow(),內部指數運算
秦九韶算法O(m)O(1)每項 1 次乘法 + 1 次加法