如何以可以提高效率的方式重新编写下面的代码?
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)]
答案 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
是多项式顺序。