【问题标题】:How to calculate a n-th element of this sequence in log(n) time or better?如何在 log(n) 时间内或更好地计算该序列的第 n 个元素?
【发布时间】:2012-09-03 18:32:42
【问题描述】:
1 4 10 22 45 88 167

这个数列是斐波那契数与其自身的卷积。 重复是

a[n] = a[n-1] + a[n-2] + Fibonacci[n+2]

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

如何以对数时间或更快的速度生成它? 请注意,这不是作业,也不是任何比赛问题。我正在研究斐波那契应用序列。

【问题讨论】:

  • 您需要整个序列吗?因为没有办法在O(log(n)) 中生成O(n) 数字。如果你只需要第n个数字look at wikipedia直接计算公式。
  • 即使从已经完成的数组中复制也是 O(n)
  • 我想在第n次计算序列的第n项而不使用记忆任何值。
  • @Grizzly:先生阅读了我的 cmets 以回应第一个澄清的答案
  • @tuğrulbüyükışık:先生阅读了我的 cmets 以回应第一个澄清答案

标签: c++ c fibonacci sequences


【解决方案1】:

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

输入:

RSolve[{a[n] == a[n - 2] + a[n - 1] + Fibonacci[n + 2], a[1] == 1, a[2] == 4}, a[n], n]

输出(点击here查看完整尺寸):

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

【讨论】:

  • ,我必须使用纯编程语言而不需要任何额外的库。我在 c/c++/java/python 中编写代码,所以理想情况下我想要一个使用这两种语言中可用功能的解决方案。
  • @thedarkknight:为什么需要额外的库来使用该论坛? (虽然我个人会选择维基百科中的那个(在我对你问题的评论中链接),因为它更容易表达)。
【解决方案2】:

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

如果您的意思是 O(log(n)) 仅计算第 n 个元素的时间复杂度,而不是全部到 n 它实际上很容易。如果您遍历,您可以通过适当的记忆轻松地为每个元素执行O(1)。

我猜是这样的:

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]:

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) 步骤,但是当你到达这一点时,你有从1 到n 的所有元素,计算每个元素的成本是O(1)。正式的证明更详细一些,但这就是想法。

【讨论】:

  • 那不会给你O(n)时间吗?
  • 我想在第n次计算序列的第n项而不使用记忆任何值。
  • @Shahbaz 正如我在答案中澄清的那样,整个序列是O(n),每个单独的术语是O(1)。当然,您无法使用此算法计算单个项。
  • 我想在运行时计算所有值,无需预先计算。
  • @thedarkknight 我在这里。迟到了,但你拼错了我的名字 ;) 你可能对this similar topic 感兴趣。类似于那里的推导,你得到(更简单的)公式a(n) = (5*n*Luc(n+3) - 2*(Luc(n+1) + Luc(n-1)))/25。
【解决方案3】:

我能够通过将递归关系转换为斐波那契卷积在 log n 时间内解决这个问题。最后,递归关系只包含卢卡斯数和斐波那契数。所以我能够在 2*log 内解决它n .一旦我弄清楚如何在这里写数学符号,我将在这里写整个证明。

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多