多项式评估时间复杂度

时间:2016-03-13 13:44:10

标签: algorithm time-complexity polynomials

我正在浏览这个链接:
http://www.geeksforgeeks.org/horners-method-polynomial-evaluation/

这里说使用常规方法的时间复杂度是O(n ^ 2)。但我想知道怎么做?这是我对此的分析:

假设我们有一个等式:2x ^ 2 + x + 1
这里for循环将执行3次,即(顺序+ 1)次

    for(int i = order ; i>=0 ; i++){
         result = result + (mat[i] * coefficient^i);
    }

所以根据这个,时间复杂度应该是O(n + 1),即O(n)。为什么它说它的O(n ^ 2)?我在这里有点迷失。甚至一个暗示会做。

3 个答案:

答案 0 :(得分:1)

链接表明,评估coefficient^i的天真方式会倍增coefficient i次。那是O(i)。对0n的所有指数重复此操作将为O(n^2)

  

评估多项式的​​一种天真的方法是逐个评估所有项。首先计算x ^ n,将该值乘以cn,对其他项重复相同的步骤并返回总和。如果我们使用简单的循环来评估x ^ n,则该方法的时间复杂度为O(n ^ 2)。

它还声称,如果你使用更好的算法计算coefficient^i,比如说,通过平方取幂,具有O(log n)复杂度,它将具有更低的总复杂度(O(n log n) ),但霍纳的方法会比那更好。

答案 1 :(得分:1)

是的,你是对的。您显示的表单通常称为Horner's Method。在基本操作(加法,乘法)的数量是 O(n)的意义上它是线性的,其中 n 是最高系数。

顺便说一句,上面的代码似乎包含错误。它应该是

for(int i = order ; i>=0 ; i--){

(原作是一个无限循环)。否则,它可以被认为是霍纳的实现。

答案 2 :(得分:1)

嗯,它可能不那么明显但是一些原始操作具有不同的时间复杂度。计算机计算+操作的结果非常快,* - 速度较慢,% - 速度更慢。这些操作在硬件上进行评估,因此它们可以获得恒定数量的处理器滴答。

^操作并非如此简单。 coefficient^i复杂度不是O(1)/常数。计算结果的简单方法是乘以coefficient i次。这将在O(i)时间内完成。另一种方法是使用二进制取幂方法,它可以提供更快的O(log(i))时间。

  

为什么说它的O(n ^ 2)?

您在多项式中有n个成员,您需要花费O(n)时间来计算每个成员的取幂运算结果。这就是为什么它是O(n 2 )。