我正在浏览这个链接:
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)?我在这里有点迷失。甚至一个暗示会做。
答案 0 :(得分:1)
链接表明,评估coefficient^i
的天真方式会倍增coefficient
i
次。那是O(i)。对0
到n
的所有指数重复此操作将为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 )。