作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
求斐波那契数列的第 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) 时间内解决。
有没有更好的办法解决这个递归问题。
最佳答案
正如您已经怀疑的那样,这将非常相似。使用 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 或 Moivre 的公式。
关于algorithm - 在 log n 时间内解决类似斐波那契的递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7686183/
我是一名优秀的程序员,十分优秀!