【发布时间】:2011-08-27 14:31:55
【问题描述】:
所以,我们看到了很多斐波那契问题。我个人讨厌他们。很多。不止很多。我认为如果我们可以让任何人都无法再次将其用作面试问题,那就太好了。让我们看看如何接近 O(1) 我们可以得到斐波那契。
这是我的开场白,几乎是从维基百科抄来的,当然还有足够的空间。重要的是,这个解决方案对于任何特别大的 fib 都会引爆,并且它包含对幂函数的相对幼稚的使用,如果你的库不好,它在最坏的情况下将其置于 O(log(n))。我怀疑我们可以摆脱幂函数,或者至少专门化它。有人来帮忙吗?除了使用查找表的有限*解决方案之外,是否存在真正的 O(1) 解决方案?
#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);
}
*我知道,我知道,对于斐波那契的任何零实际用途来说,这已经足够了。
【问题讨论】:
-
这依赖于幂函数,不是 O(c)。我的例子实际上就是那个算法。这是提到的。在我的问题中。
-
似乎最大的问题是 pow 函数,因为它不精确。也许可以将其拆分为任何错误都小于 1/2 然后舍入?然后重复? (使用单行数学方法得到第n个斐波那契)
-
当然 - 只需使用查找表 - 在 1 和
FLT_MAX之间没有那么多 斐波那契数。 ;-) -
I'll make it O(1)... O(c) 是常数时间,用于表示它可能不是单个操作。不过看起来并不标准,所以...
-
如果你想要一个简单的检查,斐波那契序列的最后一位数字形成一个模式(基数 16 每 24 次重复,基数 32 每 48 次重复,基数 64 每 96 次重复等)你可以用它来进行更准确的舍入。
标签: algorithm floating-point time-complexity fibonacci