首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在log(n)时间或更短的时间内计算此序列的第n个元素?

如何在log(n)时间或更短的时间内计算此序列的第n个元素?
EN

Stack Overflow用户
提问于 2012-09-04 02:32:42
回答 3查看 793关注 0票数 1
代码语言:javascript
运行
复制
1 4 10 22 45 88 167

这个序列是斐波那契数与其自身的卷积。递归是

代码语言:javascript
运行
复制
a[n] = a[n-1] + a[n-2] + Fibonacci[n+2]

如果假设斐波那契数列从0,1,1,2,3,5 ... (http://oeis.org/A213587)开始

我怎样才能生成对数时间或更快的?请注意,这不是家庭作业,也不是任何竞赛问题。我正在研究斐波那契应用序列。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-10 23:16:16

我能够在log时间内解决这个问题,通过将递归关系转换为斐波那契数,递归关系只包含卢卡数和斐波那契数,我可以在2*log .I中解决它,一旦我知道如何在这里写数学符号,我会在这里写下整个证明。

票数 1
EN

Stack Overflow用户

发布于 2012-09-04 03:29:17

这是一个封闭的公式,因此几乎可以保证是O(1) (使用Mathematica计算)

输入

代码语言:javascript
运行
复制
RSolve[{a[n] == a[n - 2] + a[n - 1] + Fibonacci[n + 2], a[1] == 1, a[2] == 4}, a[n], n]

Output (单击here查看完整大小):

您将不得不使用一些浮点算术,但是您仍然可以从双精度数据类型中获得更高的精度。如果精度有问题,可以使用GMP或其他任意精确库。

票数 2
EN

Stack Overflow用户

发布于 2012-09-04 02:41:55

这不是问题的实际答案,只是在 O(n)中生成整个序列的一种方法

假设你的意思是只计算第n个元素的时间复杂度,而不是所有的时间复杂度都达到n,这实际上是相当容易的。如果遍历,就可以通过适当的记忆为每个元素轻松地执行O(1)

我假设是这样:

代码语言:javascript
运行
复制
a[1] = 1, a[2] = 1, fib[1] = 0, fib[2] = 1, fib[3] = 1

然后只需迭代并记住a[n-1]a[n-2]以及fib[n-1]fib[n-2]即可:

代码语言:javascript
运行
复制
long an_1 = 1;  // a[2]
long an_2 = 1;  // a[1]
long fib_1 = 2; // fib[4]
long fib_2 = 1; // fib[3]

// Starts with a[3]
while (true)
{
    long fib = fib_1 + fib_2;
    long an = an_1 + an_2 + fib;

    std::cout << an;

    fib_2 = fib_1;
    fib_1 = fib;
    an_2 = an_1;
    an_1 = an;
}

编辑:这称为amortized complexity。计算到n-th元素需要O(n)个步骤,但是当您达到这一步时,从1n的所有元素都可用,因此计算每个元素的成本是O(1)。正式的证明要详细一点,但这就是我们的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12252621

复制
相关文章

相似问题

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