【问题标题】:Running Time of the Fibonacci Matrix Algorithm斐波那契矩阵算法的运行时间
【发布时间】:2017-06-08 18:47:27
【问题描述】:

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

找到斐波那契数列的方法之一是使用: [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。你能告诉我哪里出错了吗?

【问题讨论】:

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


    【解决方案1】:

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

    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

    中明确提及

    【讨论】:

    • 我不确定我是否理解。这与算法的运行时间/时间复杂度有什么关系?
    • 这些替代方案通过对整数重复平方来避免求幂,代之以调用诸如 pow() 或 exp() 和 ln() 之类的函数用于双精度数或浮点数。如果双打或浮点数对您来说足够好,这应该可以节省时间。至少从理论上考虑以扩展精度评估这些函数的成本,我怀疑这在理论上也会有竞争力,但我不知道在实践中是否有好的库支持这一点。
    【解决方案2】:

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

    您是正确的,然后算法执行 O(log n) 乘法,但是为了分析运行时,我们需要查看实际相乘的数字有多大。斐波那契数字呈指数级增长。事实上,它们渐近增长为 Θ(φn)。一个数的位数与该数的以 2 为底的对数成正比,因此第 n 个斐波那契数的二进制表示中的位数大致为 lg φn = n lg φ = Θ(n)。

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

    为了收紧,让我们考虑如何为该算法的运行时间编写递归关系。如果我们想将矩阵提升到 n 次方,我们递归地将矩阵提升到 (n/2) 次方,然后将结果平方(如果 n 是奇数,可能会在原始矩阵的一个副本中相乘)。假设两个 (n/2) 位数字相乘的成本是 O(n2),这给了我们递归

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

    使用主定理,我们看到这在没有对数项的情况下求解为 O(n2)。直观地说,这是因为最后一个乘法比之前的任何乘法所做的工作都多得多,事实上,将所有前面的乘法的工作相加得到了由最后一个乘法渐近支配的东西。这样就消除了日志因素。

    这里的另一个见解是,我们实际上可以比 O(n2) 更快地乘以 n 位数字。多年来,为此开发了许多算法(著名的 Karatsuba 算法,以及最近的 Furer 算法),它们在时间 O(nα) 中运行某个常数 1 ≤ α

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

    根据主定理,这解决了 O(nα),与您的来源相匹配。

    总结一下:

    1. 我们首先在第 n 步确认我们相乘的数字有 Θ(n) 位。

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

    3. 最后,我们通过使用更好的乘法算法来收紧我们的运行时限制,从而改进了这种递归关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2013-03-31
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2020-01-18
      相关资源
      最近更新 更多