秦九韶算法 與 暴力算法 求多項式 時間對比 C程序

 秦九韶算法 介紹:

       一般地,一元n次多項式的求值需要經過(n+1)*n/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法。在人工計算時,一次大大簡化了運算過程。

把一個n次多項式

改寫成如下形式:

多項式的值時,首先計算最內層括號內一次多項式的值,即

V1=an*x+a n-1

然後由內向外逐層計算一次多項式的值,即

這樣,求n次多項式f(x)的值就轉化爲求n個一次多項式的值。

結論:對於一個n次多項式,至多做n次乘法和n次加法。

實例 C 程序:

//比較不同算法實現的求100階多項式的運行時間

#include<stdio.h>
#include<time.h>
#include<math.h>
clock_t start, stop;
#define N_items 101  //多項式最大階數+1
#define MAXK 1e5     //運行函數10的7次方次,爲了看到時間
double time_s;
void myfun1(int n, double a[], double x);   //暴力算法
void myfun2(int n, double a[], double x);   //秦九韶算法
int main()
{
    double a[N_items] = {1};
    for(int i = 1; i < N_items; i++)
        a[i] = (double)i;

    start = clock();
    for(int i = 0; i < MAXK; i++)
        myfun1(N_items-1, a, 1.1);
    stop = clock();
    time_s = (double)(stop - start)/CLK_TCK;
    printf("ticks_fun1 = %lf\n", (double)(stop - start));
    printf("time_s_fun1 = %lf\n", time_s);

    start = clock();
    for(int i = 0; i < MAXK; i++)
        myfun2(N_items-1, a, 1.1);
    stop = clock();
    time_s = (double)(stop - start)/CLK_TCK;
    printf("ticks_fun2 = %lf\n", (double)(stop - start));
    printf("time_s_fun2 = %lf\n", time_s);
    getchar();
    return 0;
}
void myfun1(int n, double a[], double x)
{
    double  result = a[0];
    for(int i = 1; i <= n; i++)
        result += i/pow(x, i);
}
void myfun2(int n, double a[], double x)
{
    double  result = a[n];
    for(int i = n; i > 0; i--)
        result =  a[i-1] + x * a[i];
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章