C ++算法:如何提高此代码的效率? [大-O]

时间:2017-11-22 20:43:46

标签: c++ algorithm

如何以可以提高效率的方式重新编写下面的代码?

Fraction Polynomial::solve(const Fraction& x) const
{
    Fraction rc;

    auto it = poly_.begin();
    while (it != poly_.end())
    {
        Term t = *it;
        //find x^exp
        Fraction curr(1, 1);
        for (int i = 0; i < t.exponent_; i++)
        {
            curr = curr * x;
        }
        rc += t.coefficient_ * curr;
        it++;

    }
    return rc;
}

此代码的当前Big-O表示法是什么? [我认为它是O(N ^ 2)]

1 个答案:

答案 0 :(得分:4)

我引用数字食谱,第5章,因为它很有趣:

  

我们假设您知道的永远不会评估多项式   方式:

     

p=c[0]+c[1]*x + c[2]*x*x +c[3]*x*x*x + c[4]*x*x*x*x;

     

或(更糟糕的是!),

     

p=c[0]+c[1]*x+c[2]*pow(x,2.0)+c[3]*pow(x,3.0)+c[4]*pow(x,4.0);

     

来   (计算机)革命,所有人都被判有罪   行为将被即时执行,他们的程序将不会!它   然而,是否有写作的问题

     

p=c[0]+x*(c[1]+x*(c[2]+x*(c[3]+x*c[4])));

     

     

p=(((c[4]*x+c[3])*x+c[2])*x+c[1])*x+c[0];

     

...

至少这会从m实施中移除O(m*n)(其中m是指数,n是多项式顺序。