【问题标题】:Fibonacci Search斐波那契搜索
【发布时间】:2011-11-27 19:22:31
【问题描述】:

请给我解释一下斐波那契搜索算法。

我已经尝试了很多资源并搜索了很多,但算法仍然不清楚。大多数资源都在与二进制搜索的链接中描述了它,但我不理解它们。我知道斐波那契搜索算法是对二分搜索的扩展,我很清楚。

我的书也没能解释清楚。

我知道定义为 F(n) = F(n-1) + F(n-2) 的斐波那契数,所以无需解释。

通过添加@AnthonyLabarre 所说的我完全不理解的内容来更新问题:

我使用的这本书有奇怪的符号,没有任何解释。在此处发布算法,请帮助。

if(key == a[mid]) return mid; // understood this, comes from binary search
if(key > a[mid]) {
  if(p == 1) return -1; // What is p? It comes as a function arg
  mid = mid + q; //Now what's this q? Again comes a function arg
  p = p - q; // Commented as p=fib(k-4)
  q = q-p; // q = fib(k-5)
 } else // key < a[mid] {
  if(q == 0) return -1;
  mid = mid - q;
  temp = p - q;
  p = q; // p=fib(k-3)
  q = temp; // q = fib(k-4)
  return fibsearch(a, key, mid, p, q);
}

【问题讨论】:

  • 嗯,到目前为止你检查了什么,也许是this?
  • 你没有得到它只是证明它对你来说太复杂了,而不是书籍失败了。学会承担责任!
  • @home 我检查了那个和这个 - ics.forth.gr/~lourakis/fibsrch 和其他几个,包括动画。还不清楚。 ^_^
  • @Blindy 我很乐意这样做,但不幸的是,我必须在我的实际文件中这样做。
  • 你能准确指出你不明白的地方吗?我很难猜到,尤其是如果你了解二分搜索的话。

标签: c algorithm search fibonacci


【解决方案1】:

我会尽量让事情简明扼要。假设您有一个排序数组 A。该数组中有元素,其值不断增加。您必须在此数组中找到特定元素。您希望将整个 Array 划分为子数组,以便对 Array 中第 i 个元素的访问时间与 i 不成正比em>。这意味着非线性更快的方法。 Fibonacci Series 来帮忙了。斐波那契数列最重要的属性之一是“golden ratio”。您将数组划分为位于斐波那契数列 (0,1,1,2,3,5,8,13,21,34...) 中的索引处的子数组。

因此,您的数组将被划分为 A[0]...A[1]、A[1] 等区间。 ..A[1], A[1]...A[2], A[2 ]...A[3], A[3]...A[5], A[5 em>]...A[13], A[13]...A[21], A[21 ]...A[34],依此类推。现在由于数组已排序,只需查看任何分区的开始和结束元素即可告诉您您的编号位于哪个分区。因此,您遍历元素 A[0]、A[1]、A[2]、A[3]、A[5]、A[ 8]、A[13]、A[21]、A[34]...除非当前元素是大于您要查找的元素。现在您可以确定您的编号介于当前元素和您访问的最后一个元素之间。

接下来,您保留 A[f(i-1)]..A[f(i)] 中的元素,其中 i 是您所在的索引当前穿越; f(x) 是斐波那契数列,重复相同的过程,除非你找到你的元素。

如果您尝试calculate the complexity 这种方法,则为 O(log(x))。这具有减少搜索所需的“平均”时间的优点。

我相信你应该能够自己写下代码。

【讨论】:

    【解决方案2】:

    cmets 中提供的参考资料是正确的,但我会尝试为您换一种说法。

    它不断地将列表划分为长度为斐波那契数列 (n = F(m)) 中的数字的子列表,然后搜索同样在斐波那契数列中的倒数第二个索引 (F(m-1 ))。

    所以如果一个列表或子列表有 n 项长,其中 n = F(m),它会先在 F(m-1) 处搜索,然后如果寻找的值大于找到的值,它就会工作使用从 F(m-1)+1 到 F(m) 的子列表,或者如果寻找的值小于找到的值,它将使用从 1 到 F(m-1) 的子列表。

    由于斐波那契数的性质,这些子列表中的任何一个也将具有斐波那契数的长度,并且该过程将重复。该算法的优点是在每一步中,在列表中搜索的下一个地址将比在正常二进制搜索的同一步骤中更接近当前地址,这就是为什么该算法在慢速顺序访问介质中具有优势的原因,例如磁带机。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2015-06-05
      • 2014-05-23
      • 2013-08-09
      • 2013-03-31
      • 2014-05-03
      • 2010-12-03
      相关资源
      最近更新 更多