计算Big-O运行时

时间:2017-11-24 00:40:09

标签: c++ time-complexity big-o code-analysis

我迫切需要为以下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)。如果有人能提供任何指导,我们将不胜感激。我想知道如何回答这个问题,但我在网上找不到任何其他类似的功能,所以我在这里。谢谢。

2 个答案:

答案 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)。