【问题标题】:Complexity running times LAB and fibonacci numbers (java)复杂运行时间 LAB 和斐波那契数 (java)
【发布时间】:2011-01-12 18:37:45
【问题描述】:

一直在看这个页面,有很多很棒的人在外面帮忙,所以我有一个实验室作业,我知道我必须做一个关于斐波那契数的方法来计算位置 n 的数字,但我不太确定该怎么做把我知道的方法放在里面是我必须考虑的希望你能给和想法。遇到麻烦了。(不是要求为我做硬件好吗)谢谢。

  1. 斐波那契数和复杂性

斐波那契数的递归定义如下:
F(n) = n,对于 n F(n) = F(n-1) + F(n-2) 对于 n>1
编写以下方法来计算 F(n):
a) 基于递归定义的 O(2n^n) 方法
b) 使用循环的 O(n) 方法
c) 使用封闭形式解决方案的 O(1) 方法 - 随时在线查找此公式。

使用 n = 10 测试所有三种方法; 20; 50; 100; 1,000; 10,000; 100,000 和 1,000,000。如果特定算法和输入组合没有在合理的时间内返回答案,请在报告中注明(也就是说,不要等待数小时(或更糟)才能完成程序)。

【问题讨论】:

    标签: java data-structures complexity-theory big-o


    【解决方案1】:

    我假设“Hw”表示作业,所以恐怕没有代码。

    a) O(2n) 和 O(n) 是一回事。你的意思是 O(2^n) 吗?如果您使用递归方法而不缓存结果,就会发生这种情况。

    b) 这是实现它的“明显”方式,使用程序实现并记住最后两个数字并使用它们来计算下一个数字。在伪代码中,它类似于loop { a, b = b, a+b; }

    c) 这对所有 n 都不起作用,除非您具有无限精度,并且无限精度不是 O(1)。例如,当我使用双打时 fib(73) 的结果是 806515533049395,但实际上是 806515533049393。差异是由于使用浮点数时的舍入误差造成的。

    关于 O(n) 解决方案,如果您要计算 fib(1000000),那么 64 位整数将不会足够接近存储结果。您需要使用 BigIntegers。添加两个 BigInteger 并不是 O(1) 的运算,所以我之前提到的 O(n) 性能太乐观了。

    【讨论】:

    • 递归的方式其实更接近1.6^n
    • 是的,我的意思是在a中。我知道它会自动采用递归方法,主要是我不知道在方法中实际要做什么来计算n位置。我有点困惑。
    • @贾斯汀:好点。一棵树总是比另一棵树的深度略小,小于 2^n。
    【解决方案2】:

    好吧,回答c 部分,有一个常数时间函数可以计算第 n 个斐波那契数。你可以在这里找到它的公式:http://en.wikipedia.org/wiki/Fibonacci_number#Closed_form_expression

    【讨论】:

    • 感谢我找到的最后一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多