【问题标题】:Fibonacci algorithm to find if a number(or a close neighbour) is the difference between 2 fibonacci numbers斐波那契算法找出一个数字(或近邻)是否是 2 个斐波那契数字之间的差
【发布时间】:2014-12-10 16:26:25
【问题描述】:

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

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

【问题讨论】:

  • @HighPerformanceMark 将这一点与该系列在前几个术语之后单调递增的事实相结合......
  • 我明白了,但我们以 29 为例,即 34 - 5,两者都是斐波那契数。如果 n 数幸运地是一个斐波那契数,那么问题就解决了,但在这种情况下,我不能使用该属性。
  • 啊哈。我将您的问题解释为两个连续值之间。
  • 我相信一个确切的数字也将是斐波那契数(21+8)的总和。也许从最大的小谎言开始,然后开始向后添加。
  • 我的问题明确指出它必须是差异而不是总和

标签: algorithm math fibonacci


【解决方案1】:

假设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的最佳值。

【讨论】:

  • 感谢您的回复。我需要一点时间来理解这个解决方案。一旦我将起草一个草案来理解这个概念,我就会回来。
【解决方案2】:

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

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

然后您可以将值放入一维数组(如果需要,您也可以将两个斐波那契数对放入其中)。然后只需按值对数组进行排序。通过对这个数组执行二分查找,如果存在这样的数 n,您可以非常快速地找到,如果不存在,那么与 n 最接近的是什么。

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

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

【讨论】:

  • 感谢您的回复。我假设您说 2^64 for long long signed int。我希望我不需要这么高的精度,我会尝试实现你的想法。 BRB
猜你喜欢
  • 2020-01-18
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多