Fibonacci算法用于查找数字(或近邻)是否是2个斐波纳契数之间的差异

时间:2014-10-15 14:33:33

标签: algorithm math fibonacci

我希望有人可以帮助我。给定一个数字n(不必是斐波纳契数),我必须找到这个数字是否等于两个斐波纳契数之间的差值,如果不是,我必须将最接近的数字返回到n,让我们称它为m(这是不必是斐波纳契数),这是两个斐波纳契数之间的差异。

我不是在寻找确切的算法实现,而是在某些指针上查看。

2 个答案:

答案 0 :(得分:4)

假设n > 0没有太多普遍性。自1 = 1 - 0 = fib(1) - fib(0)起,结果m也是正数。设0 ≤ i < j并考虑fib(j) - fib(i)。我们有界限

fib(j-2) = fib(j) - fib(j-1) ≤ fib(j) - fib(i) ≤ fib(j).

因此,对于每个n,只需考虑fib(j-2) ≤ n ≤ fib(j)的可能性。事实上,我们可以将其收紧到fib(j-2) < n ≤ fib(j),因为我们也可以将fib(j) - fib(j-1)写为fib(j-2) - fib(0)。计算对数/使用二进制搜索以查找j的两个有效设置。对于j的每个设置,请以相同的方式找到i的最佳值。

答案 1 :(得分:2)

n的范围是多少? 如果n最多为2 ^ 64,则可以容纳93(根据http://oeis.org/A000045/b000045.txt)斐波纳契数。所以我们有93 * 93对数字。

并不是很多,所以你可以做一个大小为93x93的二维数组(略小于10000个元素),这样数组中的每个元素都是第i个和第j个斐波纳契数之间的差异,i和j是数组的索引。

然后你可以把值放到一维数组中(如果需要的话,你也可以把两个斐波那契数字放在一起)。然后只需按值对数组进行排序。通过对此阵列执行二进制搜索,如果存在这样的数字n,则可以非常快地找到,或者如果不存在,则可以找到与n最接近的数字。

您可以跳过制作二维数组并将值直接放到一维数组中。我这样说,所以更容易理解和呈现这个概念。

它可能不是最好的方法,如果n可能很大,但在某些情况下,当你需要很多测试时,它应该是合理的方法。