Algorithm 对数n时间内类Fibonacci递推的求解

Algorithm 对数n时间内类Fibonacci递推的求解,algorithm,math,Algorithm,Math,斐波那契级数第n项的求法 f(n)=f(n-1)+f(n-2)可以通过记忆在O(n)时间内求解 一种更有效的方法是使用分治法在对数n时间内求解斐波那契矩阵[[1,1],[1,0]]的n次方 是否有类似的方法可供参考 f(n)=f(n-1)+f(n-x)+f(n-x+1)[x是某个常数] 只需存储以前的x元素,就可以在O(n)时间内解决此问题 有没有更好的方法来解决这个递归问题。正如您已经怀疑的那样,这将非常类似。使用x*x矩阵的n次方 |1 0 0 0 .... 1 1| |1 | 1 |

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

一种更有效的方法是使用分治法在对数n时间内求解斐波那契矩阵[[1,1],[1,0]]的n次方

是否有类似的方法可供参考 f(n)=f(n-1)+f(n-x)+f(n-x+1)[x是某个常数]

只需存储以前的x元素,就可以在O(n)时间内解决此问题


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

正如您已经怀疑的那样,这将非常类似。使用
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被认为是常数时)


对于Fibonacci递推,还有一个闭合公式解决方案,请参见此处,查找Binet或Moivre公式。

您可能需要研究Tribonacci数(以及其他Fibonacci数的推广)。它们已经得到了相当广泛的研究。请参见,例如

这是一个很好的问题,但您可能会在math.stackexchange.com上得到更好的答案……或者您可以查看并尝试调整所提供的工具,以计算您的问题的特定解决方案。同样的方法,但矩阵的大小将是x乘以x。这是否有效取决于x和n的相对大小。比奈公式不是O(1),因为它包含n次幂,需要以足够高的精度进行计算。实际上,它比矩阵的二元幂运算慢。请注意,对于这种情况,还有一个封闭形式的解决方案。简单地诊断递归矩阵。取第n次幂将解耦为提升到第n次幂的
x
标量,您只需转换回原始基一次。(好吧,我怀疑这个解释对于这个论坛来说有点简洁,但无论如何…)我想到了这个,但是有没有更有效的方法呢?这需要O((x^3)*logn)。@elricL:小心这些复杂性。由于涉及的数字越来越大,我们不能假设——比如说——加法是O(1)。即使计算像3^n这样简单的东西也是O(n log(n))。至于你原来的问题:递归矩阵的二元幂运算(不带对角化)可能是你最好的选择,因为它的复杂性与带对角化的解相同,但前者可以用整数算术来完成。@elricL:你可以用O(x²)来做矩阵乘法,这需要一些洞察力(计算O(x²)中的一行,然后分别计算O(x²)中的其他行)