斐波那契搜索

时间:2011-09-29 15:13:33

标签: c algorithm search fibonacci

有人请解释我的斐波纳契搜索算法。

我已经尝试了很多资源并进行了大量搜索,但算法仍然不清楚。大多数资源都将其描述为与二进制搜索相关联,但我不理解它们。我知道斐波纳契搜索算法是二进制搜索的扩展,我很清楚。

我的书也未能解释。

我知道斐波纳契数定义为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);
}

2 个答案:

答案 0 :(得分:9)

我会尽量保持简短明了。假设您有一个已排序的数组 A 。此数组中包含元素,其值越来越大。您必须在此数组中找到特定元素。您希望将整个数组划分为子数组,以便对数组中 i 元素的访问时间与 i 即可。这意味着一种非线性更快的方法。这里有Fibonacci Series帮助。 Fibonacci系列最重要的特性之一是“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 ] ... A [ 13 ],A [ 13 ] ... A [ 21 ],A [ 21 ] ... A [ 34 ],依此类推。现在,由于数组已排序,只需查看任何分区的起始和结束元素,就会告诉您数字所在的分区。因此,您遍历元素A [ 0 ],A [< em> 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))。这具有减少搜索所需的“平均”时间的优点。

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

答案 1 :(得分:2)

评论中提供的参考文献是正确的,但我会尝试用不同的方式为您说出来。

它不断地将列表划分为子列表,其长度是Fibonacci序列中的数字(n = F(m)),然后搜索最后一个也在Fibonacci序列中的索引(F(m-1) ))。

因此,如果列表或子列表长n个项目,其中n = F(m),它将首先搜索F(m-1),然后如果搜索的值大于找到的值,则它将起作用使用从F(m-1)+1到F(m)的子列表,或者如果搜索到的值小于找到的值,它将使用从1到F(m-1)的子列表。

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