【问题标题】:Solving a Fibonacci like recurrence in log n time在 log n 时间内求解类似斐波那契的递归
【发布时间】:2011-10-07 10:45:24
【问题描述】:

找到斐波那契数列的第 n 项 f(n) = f(n-1) + f(n-2) 可以通过记忆化在 O(n) 时间内求解。

更有效的方法是使用分治法在 log n 时间内找到矩阵 [ [1,1] , [1,0] ] 的 n 次方。

是否有类似的方法可以遵循 f(n) = f(n-1) + f(n-x) + f(n-x+1) [ x 是某个常数]。

只需存储之前的 x 个元素,这可以在 O(n) 时间内解决。

有没有更好的方法来解决这个递归。

【问题讨论】:

  • 这是一个很好的问题,但您可能会在 math.stackexchange.com 上得到更好的答案
  • 也许您可以查看cs.uiuc.edu/~jeffe/teaching/373/notes/recurrences.pdf 并尝试调整所提供的工具来计算针对您的问题的特定解决方案。
  • 同样的方法,但是矩阵的大小是 x x x。天气与否这是否有效将取决于 x 和 n 的相对大小。

标签: algorithm math


【解决方案1】:

正如您已经怀疑的那样,这将非常相似。使用x * x矩阵的n次方

|1 0 0 0  .... 1 1|
|1 
|  1
|    1
|      1
|        1
...................
...................
|          ... 1 0|

如果你把这个矩阵乘以向量就很容易理解了

f(n-1), f(n-2), ... , f(n-x+1), f(n-x)

导致

f(n), f(n-1), ... , f(n-x+1)

矩阵求幂可以在 O(log(n)) 时间内完成(当 x 被认为是常数时)。

对于斐波那契递归,还有一个封闭公式的解决方案,看这里http://en.wikipedia.org/wiki/Fibonacci_number,寻找Binet's 或Moivre's 公式。

【讨论】:

  • Binet 的公式不是 O(1),因为它包含需要以足够高的精度评估的 n 次方。在实践中,它比矩阵的二进制取幂要慢。
  • 请注意,对于这种情况,还有一个封闭形式的解决方案。简单地对递归矩阵进行对角化。取 n 次方将解耦为 x 标量被提升到 n 次方,您只需转换回原始基础一次。 (好吧,我怀疑这个解释对于这个论坛来说有点简洁,但无论如何......)
  • 我想到了这个,但是有没有更有效的方法呢?这需要 O((x^3)*logn)。
  • @elricL:小心这些复杂性。由于涉及的数字变大,我们不能假设——比如说——加法是 O(1)。即使计算像 3^n 这样简单的东西也是 O(n log(n))。至于你原来的问题:递归矩阵的二进制取幂(没有对角化)可能是你最好的选择,因为它与解决方案具有相同的复杂性 with 对角化,但前者可以在整数算术中完成.
  • @elricL:您可以通过一些见解在 O(x²) 中进行矩阵乘法(在 O(x²) 中计算一行,然后在 O(x) 中计算其他行)
【解决方案2】:

您可能想研究 Tribonacci 数(以及斐波那契数的其他概括)。它们已被广泛研究。参见例如Generalizations of Fibonacci numbers

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2016-06-27
    • 2014-12-28
    • 2014-04-02
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多