Fibonacci矩阵算法的运行时间

时间:2017-01-24 04:52:22

标签: algorithm runtime time-complexity big-o fibonacci

我正在尝试向Dasgupta,Papadimittriou和Vazirani - Algorithms学习。我发现了一个我无法回答的问题,我们将不胜感激任何帮助/提示。

找到Fibonacci系列的方法之一是使用:     [Fn Fn + 1] = [0 1 1 1] ^ n。 [F0 F1]

根据我的运行时间,应为O(n^2 * Log n)"n^2"用于乘以n位数,“log n”用于乘法的次数。

但是,该书建议运行时间为O(M(n)) M(n)=theta(n^a), 1<=a<=2。你能告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分:0)

计算斐波那契数的两种可能方式:

1)有一个封闭的表单表达式,您可以通过将其视为线性递归来导出,https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression

2)这似乎是可对角化的矩阵,因此您可以将其写为PDP ^ -1,其中D是对角线,并且(PDP ^ -1)^ n = P D ^ n P ^ -1。由于D是对角线,您可以通过获取每个对角线元素的功率来计算其功率。事实上,在https://en.wikipedia.org/wiki/Diagonalizable_matrix#An_application

中明确提到了斐波纳契矩阵

答案 1 :(得分:0)

让我们更详细地看一下算法。

你是正确的,然后算法进行O(log n)乘法,但为了分析运行时,我们需要看看实际乘以的数字有多大。 Fibonacci数量迅速呈指数增长。实际上,它们渐近地增长为Θ(φ n )。数字中的位数与该数字的基数2对数成正比,因此第n个斐波纳契数的二进制表示中的位数大致为lgφ n = nlgφ =Θ(n)。

我们可以按照您的方式进行分析,并说因为我们正在进行O(log n)次乘法,并且每次乘法都使用最多n位数的数字,并且每次乘法需要时间O(n < sup> 2 )运行时间为O(n 2 log n)的时间,但这不是一个严格的约束。

为了解决问题,让我们考虑如何为此算法的运行时编写递归关系。如果我们想要将矩阵提升到第n次幂,我们递归地将矩阵提升到第(n / 2)次幂,然后将该结果平方(如果n是奇数,则可能在原始矩阵的一个副本中相乘)。假设两个(n / 2) - 数字相乘的成本是O(n 2 ),这就给我们重现

  

T(n)= T(n / 2)+ O(n 2 )。

使用主定理,我们看到这解决了没有对数项的O(n 2 )。直观地说,其原因在于,最后的乘法比以前的乘法中的任何一个都要大得多,事实上总结前面所有乘法的工作总是给出了最后乘法渐近支配的东西。这样就摆脱了对数因子。

这里的另一个见解是,我们实际上可以比n(n 2 )更快地乘以n位数字。多年来开发了许多算法(着名的是Karatsuba算法,以及最近的Furer算法),其在时间O(n α)中运行一些常数1≤α<1。 2.如果我们使用其中一种更快的算法,则重复出现

  

T(n)= T(n / 2)+ O(n α

这通过主定理解决了O(n α),匹配你的来源。

总结:

  1. 我们首先确认我们在一起乘以的数字在步骤n中有Θ(n)位数。

  2. 然后,我们使用朴素乘法算法为运行时写了一个递归关系,该算法求解为没有任何对数因子的二次项。

  3. 最后,我们通过使用更好的乘法算法来加强我们的运行时限,从而改善了递归关系。