一尘不染

可以编写Fibonacci函数以在O(1)时间执行吗?

algorithm

因此,我们看到了很多斐波那契问题。我个人讨厌他们。很多。不止是很多。我以为如果我们不能让任何人都无法再次将其用作面试问题,那将是一件好事。让我们看看我们可以得到斐波那契接近O(1)的程度。

这是我的开场白,来自Wikipedia,当然还有很多净空。重要的是,此解决方案会针对任何特别大的fib爆炸,并且包含幂函数的较幼稚的使用,如果您的库不好,则将其置于O(log(n))最坏的情况。我怀疑我们可以摆脱幂函数,或者至少要专门化它。有人在帮忙吗?除了使用查找表的有限*解决方案之外,是否存在真正的O(1)解决方案?

http://ideone.com/FDt3P

#include <iostream>
#include <math.h>
using namespace std; // would never normally do this.

int main()
{
int target = 10;
cin >> target;
// should be close enough for anything that won't make us explode anyway.
float mangle = 2.23607610;

float manglemore = mangle;
++manglemore; manglemore = manglemore / 2;
manglemore = pow(manglemore, target);
manglemore = manglemore/mangle;
manglemore += .5;
cout << floor(manglemore);

}

*我知道,对于斐波那契的零实际用途中的任何一项,这已经足够了。


阅读 202

收藏
2020-07-28

共1个答案

一尘不染

给定任意大的输入,仅读取n就需要O(log
n),因此从这个意义上讲,不可能使用恒定时间算法。因此,使用封闭式解决方案或预先计算您关心的值,以获得合理的性能。

编辑:在评论中指出,这实际上是更糟的,因为fibonacci正在O(phi^n)打印Fibonacci 的 结果O(log (phi^n))O(n)

2020-07-28