关于斐波那契查找思路的问题总结

前言:

在学习斐波那契查找的过程中,刚开始以为和插值查找一样,变变公式加上几个判断条件,就照着二分查找的思路走一下,万万没想到,整个学习过程仍然花费了不少功夫,你敢信,这家伙并不像看起来的那样美丽。回到正题,其实网上关于这个查找过程实现和代码都有不少,从中能收获不少,但是还是有许多地方与实现思路有问题,就比如说创建一个临时数组的长度是怎样的?这里我会总结一些思路上容易纠结的地方,如果我还是没讲清楚,推荐去debug一下代码,梳理一下。


需要特别注意的几个地方和解释:

整个查找的实现流程如下:
---->
创建一个斐波那契的数列。
---->
在斐波那契的数列中寻找一个下标。即使得这个斐波数列的值大于等于这个数组的长度,等价于当斐波数列的这个值小于这个数组的长度时,我们移动斐波数列的下标,可以这样表示 当arr.length>fib(k);或者high>fib(k)-1时,我们k++; 这么做的目的就是为了使我们构造的临时数组长度符合斐波那契分割的大小。
---->
创建临时数组temp,大小是斐波那契的fib(k)值。把待排序的数组放入temp中,因为上一步,我们的fib(k)里面的值是大于或等于待排序数组的长度,所以这一步中temp中会有余留的默认空间,这个空间的值要赋多少呐?赋的就是待排序数组的最后一个,那重复到哪停止呐,没错,就是到下标fib(k)-1的位置,注意,有些文章上走到了下标是fib(k)的位置,这是不准确的,实际上这个temp数组的大小就是fib(k)。
---->
开始查找,查找的左右方向和low及heigh,因为与二分查找类似,所以这个没什么变化,唯一难理解的点还有一个k–与k-=2。在这里插入图片描述

我们依次来分析,这个问题理解起来确实很抽象,不过我这提供一个思路供参考,因为mid = low+fib[k-1]-1(解释如上图),当所查的值小于临时数组中mid下标的值时,需要向左查找,实际上,第一轮时,temp中总的元素个数是f(k),且由于斐波那契数列性质f(k)=f(k-1)+f(k-2),mid左边(包括mid)在内的元素个数有f(k-1)个,mid右边(不含mid)元素个数是f(k-2)个,如果下一次向左查找,那么f(k-1)个数再进行黄金分割,那么要分出f(k-2)、f(k-3),而此时mid = low+f(k-2)-1,故此时k要去减一;而因为在右半部分有f(k-2)个数,需要分别划分出f(k-3),f(k-4)那么右边mid等于什么?你说对了,mid = low+f(k-3)-1,此时mid要去减2。
---->最后找到的那个值还要判断一下,是不是返回的在原来的数组的大小内,如果在原来待排序的数组中就直接返回mid,否则就返回原来数组的最大值。
代码部分同下面的参考。
参考:https://blog.youkuaiyun.com/zhizhengguan/article/details/106924447
https://segmentfault.com/a/1190000022946416?utm_source=tag-newest
https://blog.youkuaiyun.com/interesting_code/article/details/104322118

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值