因此,我们看到了很多斐波那契问题。我个人讨厌他们。很多。不止是很多。我以为如果我们不能让任何人都无法再次将其用作面试问题,那将是一件好事。让我们看看我们可以得到斐波那契接近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); }
*我知道,对于斐波那契的零实际用途中的任何一项,这已经足够了。
给定任意大的输入,仅读取n就需要O(log n),因此从这个意义上讲,不可能使用恒定时间算法。因此,使用封闭式解决方案或预先计算您关心的值,以获得合理的性能。
编辑:在评论中指出,这实际上是更糟的,因为fibonacci正在O(phi^n)打印Fibonacci 的 结果O(log (phi^n))是 O(n) !
O(phi^n)
O(log (phi^n))
O(n)