我迫切需要为以下C ++函数计算Big-O运行时的一些指导:
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;
}
这对我来说仍然是一个新概念,所以我在纠正它时遇到了一些麻烦。我假设至少有两次操作发生一次(auto it = poly_.begin,最后返回rc),但我不知道如何计算while循环的操作次数。据我的教授说,正确的运行时间不是O(n)。如果有人能提供任何指导,我们将不胜感激。我想知道如何回答这个问题,但我在网上找不到任何其他类似的功能,所以我在这里。谢谢。
答案 0 :(得分:0)
假设这是一个n阶多项式(最高项被提升到n的幂)。
在外部while循环中,您将遍历n + 1个术语(两侧为0到n)。
对于每个项,在内部for循环中,您将执行乘法m次,其中m是当前项的幂。由于这是n次多项式,因此m的范围为0到n。平均而言,您将进行n / 2次乘法运算。
整体复杂度为O((n + 1)*(n / 2))= O(n ^ 2)
答案 1 :(得分:0)
我假设您想要在给定点(合理值,因为它作为分数给出)中评估某个多项式(让我们说A_n*X^n + ... + A_0
)。
第一个while
循环将遍历多项式的所有单个组件。对于n次多项式,将产生n + 1
次迭代,因此外部循环仅需要O(n)时间。
但是,对于多项式的每个项(我们说等级i
),您必须计算X^i
的值,这就是您的内部for
循环所做的。它使用线性方法计算X^i
,产生线性复杂度:O(i)。
由于您有两个嵌套循环,因此通过将循环的最坏情况时间复杂度相乘来获得整体复杂性。得到的复杂性由O(n)* O(n)= O(n ^ 2)给出。 (第一项表示while
循环的复杂性,而第二项表示计算X^i
的最坏情况时间复杂度,i == n
时为O(n)。