一、斐波那契查找算法介绍
- 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
- 斐波那契数列指的是这样一个数列:
- 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597······
- 这个数列从第3项开始,每一项都等于前两项之和。
- 斐波那契查找原理与二分查找算法和插值查找算法类似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,公式 mid=low+F(k-1)-1,(F代表斐波那契数列,k代表斐波那契数列分割数值的下标),如下图:
对一个有序数组进行斐波那契查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有返回-1。
五、斐波那契算法代码示例1、代码
package com.rf.springboot01.dataStructure.search;
import java.util.Arrays;
/**
* @description: 斐波那契查找算法示例
* @author: xiaozhi
* @create: 2020-08-22 22:47
*/
public class FibonacciSearch {
public static void main(String[] args) {
int[] arr={1,8, 10, 89, 1000, 1234};
int index=fibSearch(arr,1);
int index1=fibSearch(arr,1234);
int index2=fibSearch(arr,108);
System.out.println("1的数组下标=" +index);// 0
System.out.println("1234的数组下标=" +index1);// 5
System.out.println("108的数组下标=" +index2);// -1
}
/**
* @Description: 使用非递归方法得到一个长度为20的斐波那契数列
* 利用公式 F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
* @Param: []
* @Author: xz
* @return: int[]
* @Date: 2020/8/22 22:48
*/
public static int[] fib(){
int[] F=new int[20];
F[0]=1;
F[1]=1;
for(int n=2;nF[k]-1){ //输出 high:5 F:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233...]
k++;
}
//因为F[k]值可能大于arr的长度,因此我们需要使用Arrays类,构造一个新的数组,并指向temp[]
//不足的部分会使用0填充
int[] temp =Arrays.copyOf(arr,F[k]); //输出 temp: {1,8, 10, 89, 1000, 1234,0,0}
//实际上需求使用arr数组最后的数填充到temp数组中
for(int i=high+1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?