算法导论学习日记(8)霍纳规则

引用一下百度关于霍纳规则的解释

用来简化朴素多项式的求值,在中国叫秦九韶算法。
霍纳规则是一种将一元n次 多项式的求值问题转化为n个一次式的算法。其大大简化了计算过程,即使在现代,利用计算机解决多项式的求值问题时,霍纳规则依然是最优的算法规则。
霍纳规则是采用最少的乘法运算策略,求多项式A(x) = a n x n + a n-1 x n-1 +...+ a 1 x + a 0 在x0处的值,该规则是A(x 0 )=(...((a n x 0 + a n-1 )x 0 +...+ a 1 )x 0 + a 0 )

对于这个一元多次多项式的朴素多项式求值来讲,算法复杂度应该近似于1+2+3+4+……+n=1/2*n*(n-1),即O(n^2)的复杂度。

然而使用霍纳规则,算法复杂度近似为1+1+1+1+……+1=n,即O(n)的复杂度。

换而言之,霍纳规则是个证明算法是个很有用的这件事的有力证据。

下面给出我写的递归实现的霍纳规则和普通的解法

#include <iostream>


using namespace std;
//霍纳规则
int HornerRule(int *a,int i,int n,int x)
{
    if(i==n-1)
        return a[n-1];
    else
        return a[i]+x*HornerRule(a,i+1,n,x);
}
//一般算法
int Normal(int *a,int n,int x)
{
    int sum=0,i=0,j=0;
    for(i=0;i<n;i++)
    {
        int t=1;
        for(j=0;j<i;j++)
        {
            t*=x;
        }
        sum+=a[j]*t;


    }
    return sum;
}


int main()
{
    int n[]={0,1,2,3,4,5,6,7,8,9};
    cout<<HornerRule(n,0,10,2)<<endl;
    cout<<Normal(n,10,2)<<endl;
}

我在写的时候想验证自己算法的解是正确的,但是似乎网上的数据比较少,我就给出几组用于大家验证

霍纳规则的若干解:

n=10,k=2,sum=8194

n=20,k=2,sum=18874370

n=10,k=3,sum=250959

n=15,k=3,sum=96855123

这个玩意真的很容易越界,很容易搞得很大,小心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值