数据结构-斐波那契查找

本文介绍了斐波那契查找的概念,通过实例解析了其运作过程,包括为何引入斐波那契查找以提高效率,以及代码如何实现黄金分割点的查找。详细解释了斐波那契数列在查找过程中的作用,以及代码中关键步骤的功能,如数组长度扩展和根据斐波那契数调整查找范围。
摘要由CSDN通过智能技术生成

斐波那契查找(笔记)

阅前说明

本文章是我看《大话数据结构》的一些笔记,也是我第一个博客,内容可能有错误,排版也可能反人类,还请指正。

前置知识

看这篇文章,需要自行准备一些功课
1、什么是斐波那契数列,已经斐波那契数列长什么样子
2、C语言基础
3、知道二分查找、插入查找等知识

为什么要有斐波那契查找

我们知道二分查找,无论要查找的值是大还是效,每次都是从中间开始查找,这样子有时候还是有点耽误时间。斐波那契查找就是来解决这种问题的,不会每次从中间开始查找,而是从黄金分割处开始查找(斐波那契的特点,自行百度)

举例

在这里插入图片描述
上图被查找的数组A,我们要找第六个(59)这个数字的位置

在这里插入图片描述
上图是斐波那契数列F,那程序是怎样运作的呢,下面我们把代码分开看

代码解析

先把总的代码粘贴在这里,我们后续一块一块解析
在这里插入图片描述
在这里插入图片描述

第一步,斐波那契数列和数组的关系

斐波那契数列存储的是被查找数组的长度,这个很重要!!!(这个是我自己理解的)

第二步 第一段代码解析

在这里插入图片描述
这里要解决两个疑惑,

1、这两行代码是干什么的

第一步中我们知道,斐波那契数列存贮的是数组的长度,那么这就是在查找长度的过程。 这个F[k]-1最后的值一定会大于或者等于n,到那里就会结束,也就是说F[k]的值到大于n的地方就会结束了。

2、为什么 会有 -1

是因为n代表的是下标,下标是从0开始的,所以这里会-1。

3、结束的位置在哪里

因为F[6] < n < F[7],所以,K=7的时候,就会结束了。这里F[7] = 13,前面我们说这个是数组长度,那么这个长度肯定是比A的长度要长,这个时候就要增加长度,增加长度在下一段代码中

第三步 第二段代码解析

在这里插入图片描述
这里的代码就是增加长度的,F[7]=13,此时的A的长度为11,还要增加两个,这两个的值都为最大值,也就是a[n]的值,所以有 a[i] = a[n]

第四步 第三段代码解析(重点来了)

在这里插入图片描述
在这里插入图片描述

1、 mid 会怎么变化?
mid = low + F[k-1] -1

我们知道,mid的值不是中间值,而是黄金分割出。A数组长度是13,也就是F[7], 13*0.618 = 8,也就是 F[6],所以 F[6]的值就是F[7]的值的黄金分割处,mid就会等于它,所有有F[k-1] -1 ,这里的-1我就不多说为什么了,更上面一样。那么为什么会有low,这个后面说

2、if语句内部
if (key < a[mid])
{
	high = mid -1; 这个和二分查找一样的
	k = k-1;
}

在没有执行k = k-1之前,我们刚刚已经知道了,k是为6的。这里为什么会有k = k-1,因为 key < a[mid],这就说明key肯定在 0 到 mid -1之间的。记住,这个K是表示F数组的下标,是用来查找数组长度的,F[k]的值就是数组长度 。我们之前知道,13的黄金分割是8,也就是mid的值,现在key在0 - 7之间了,0 - 7 总数为8,而 F[6] 的值是为8的,这个可以理解为,现在数组的长度只为8了,那么8的黄金分割处是几呢,8*0.618 = 5 ,而5是F[5]的下标,所以这里就有了k = k-1。欧耶

else if 语句内部
else if (key > a[mid]) {
	low = mid + 1; 这个是二分查找的
	k = k - 2
}

1、这个k = k - 2 怎么理解,斐波那契的特征,F[7] = F[6] + F[5],如果现在的key大于mid,说明key在 mid + 1 到 12之间的,这个mid的值是8,那后面就是还有4个数,加上mid一共是5个数,可以理解为数组长度现在为5,这个5就是F[5]的下标(这里有个对应关系,并不是偶然得来的,F[7] = F[6] + F[5], 那就相当于 13 = 8 + 5,。8就是key < mid 时,还需要进行对比的数组长度,5就是key > mid时,还需要进行比较的数组长度),此时K = 7,那么K就需要减少两个,所以有k = k - 2,此时K = 5了
2、刚刚有个问题,就是mid = low + F[k-1] -1,这个low这样理解,low后面加的是相对应要比较的数组的长度,例如在最开始,low = 1, F[k-1]就是8,意思就是要对比的个数为13个的时候,我就需要加上8-1个数,才能达到mid值,那同理,当要对比的数为5个的时候,此时mid应该为9 + 3 -1 = 11,,不加上low值的话,mid值就为2了,这明显是不对的。

以上就是我对斐波那契查找的理解,第一次写博客,有问题请指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值