首页
学习
活动
专区
圈层
工具
发布

算法
EN

Stack Overflow用户
提问于 2010-11-08 08:37:01
回答 10查看 6K关注 0票数 14

当k= 2时,我们都知道fibonacci级数。

即:1,1,2,3,5,8,13

但这是2-斐波纳契。就像这样,我能数到第三个斐波纳契:

代码语言:javascript
复制
1,1,2,4,7,13,24

4-斐波纳契:

代码语言:javascript
复制
1,1,2,4,8,15,29

...and就这样继续

我想问的是一个算法来计算一个k-斐波那契级数中的'n‘元素。

像这样:如果我要求fibonacci(n=5,k=4),结果应该是:8,即4-fibonacci系列中的第五个元素。

我在任何地方都没找到。需要帮助的资源可能是数学世界

有没有人?如果你知道蟒蛇我更喜欢。但如果没有,任何语言或算法都能有所帮助。

提示:让我们分析级数,其中k将从1到5。

代码语言:javascript
复制
k    fibonacci series

1    1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, ...
2    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
3    1, 1, 2, 4, 7, 13, 24, 44, 81, ...
4    1, 1, 2, 4, 8, 15, 29, 56, 108, ...
5    1, 1, 2, 4, 8, 16, 31, 61, 120, ...

通过分析,我们可以看到,级数上的数组0:k等于以前的斐波纳契级数,并且一直延续到k=1。

也就是说(我试着展示,但我没有找到正确的方式说):

代码语言:javascript
复制
k    fibonacci series

1    1, 
2    1, 1, 
3    1, 1, 2, 
4    1, 1, 2, 4, 
5    1, 1, 2, 4, 8, 

希望我能帮你解决这个问题。

python中的解决方案(如果有人需要的话)

代码语言:javascript
复制
class Fibonacci:

    def __init__(self, k):
        self.cache = []
        self.k = k

        #Bootstrap the cache
        self.cache.append(1)
        for i in range(1,k+1):
            self.cache.append(1 << (i-1))

    def fib(self, n):
        #Extend cache until it includes value for n.
        #(If we've already computed a value for n, we won't loop at all.)
        for i in range(len(self.cache), n+1):
            self.cache.append(2 * self.cache[i-1] - self.cache[i-self.k-1])

        return self.cache[n]


#example for k = 5
if __name__ == '__main__':
    k = 5
    f = Fibonacci(k)
    for i in range(10):
        print f.fib(i),
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-11-08 08:58:37

下面是基于琥珀回答的迭代解决方案构建

代码语言:javascript
复制
class Fibonacci {

    List<Integer> cache = new ArrayList<Integer>();
    final int K;

    public Fibonacci(int k) {
        this.K = k;

        // Bootstrap the cache
        cache.add(1);
        for (int i = 1; i <= k; i++)
            cache.add(1 << (i-1));
    }

    public long fib(int n) {

        // Extend cache until it includes value for n.
        // (If we've already computed a value for n, we won't loop at all.)
        for (int i = cache.size(); i <= n; i++)
            cache.add(2 * cache.get(i-1) - cache.get(i-K-1));

        // Return cached value.
        return cache.get(n);
    }
}

测试结果如下:

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        System.out.println("k     fibonacci series");

        for (int k = 1; k <= 5; k++) {
            System.out.print(k + "     ");

            Fibonacci f = new Fibonacci(k);
            for (int i = 0; i < 10; i++)
                System.out.print(f.fib(i) + ", ");
            System.out.println("...");

        }
    }
}

和指纹

代码语言:javascript
复制
k     fibonacci series
1     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
2     1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
3     1, 1, 2, 4, 7, 13, 24, 44, 81, 149, ...
4     1, 1, 2, 4, 8, 15, 29, 56, 108, 208, ...
5     1, 1, 2, 4, 8, 16, 31, 61, 120, 236, ...
票数 7
EN

Stack Overflow用户

发布于 2010-11-08 08:46:31

与2-fibonacci一样,动态规划是可行的。记住早期k的值,以便在O(n)时间内快速计算后面的值。

另一个可以用来提高k大值的速度的优化是通过f(n-1)添加f(n-k)以获得f(n),而只是使用(2*f(n-1)) - f(n-k-1)。因为它只使用两个查找、两个添加和一个乘法,所以它比k查找要好得多,当k变大时,k会添加(但它仍然是O(n),只是一个更小的常数乘数)。

票数 9
EN

Stack Overflow用户

发布于 2010-11-08 09:47:59

如果您只想求解一个值(即fibonnaci(n,k)),那么更有效的方法是使用线性递归,即O(k^3 log(n)) (可以用更好的矩阵乘法算法改进k^3因子)。

基本上,它的工作方式是将向量F(n), F(n-1) ... F(n-k)表示为矩阵乘以向量F(n-1), F(n-2) ... F(n-k-1)。然后,由于矩阵乘法是相联的,所以可以将矩阵提升到幂,并将其乘以一个初始向量F(k), F(k-1) ... F(0)

O(log(n))中,可以通过平方进行指数运算。

例如,对于k=3案例,我们将拥有:

代码语言:javascript
复制
[F(n+2)]   [1 1 1] [F(n+1)]
[F(n+1)] = [1 0 0] [F(n)  ]
[F(n)  ]   [0 1 0] [F(n-1)]

所以要解F(n),你只要找到

代码语言:javascript
复制
[F(n+2)]   [1 1 1]^n [F(2)]
[F(n+1)] = [1 0 0]   [F(1)]
[F(n)  ]   [0 1 0]   [F(0)]
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4122291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档