斐波那契查找+思路分析

图解

在这里插入图片描述

代码实现

package com.atguigu.search;import java.util.Arrays;/*** @创建人 wdl* @创建时间 2021/3/23* @描述*/
public class FibonacciSearch {public static int maxSize = 20;public static void main(String[] args) {int[] arr = {1, 8, 10, 89, 1000, 1234};System.out.println(fibSearch(arr,44));}//因为后面我们mid=low+F(k+1)-1,需要使用到斐波那契数列,因此我们需要先获取到一个斐波那契数列//非递归方法得到一个斐波那契数列public static int[] fib() {int[] f = new int[maxSize];f[0] = 1;f[1] = 1;for (int i = 2; i < maxSize; i++) {f[i] = f[i - 1] + f[i - 2];}return f;}/*** @param a   数组* @param key 我们需要查找的关键码(值)* @return 返回对应的下标,如果没有-1*///编写斐波那契查找算法//使用非递归的方法编写算法public static int fibSearch(int[] a, int key) {int low = 0;int high = a.length - 1;int k = 0;//表示斐波那契分割数值的下标int mid = 0;//存放mid值int f[] = fib();//获取到斐波那契数列//获取到斐波那契分割数的下标while (high > f[k] - 1) {k++;}//因为f[k]可能大于数组的长度,因此我们需要使用Arrays类,构造一个新的数组,并指向a[]//不足的部分会使用0填充int[] temp = Arrays.copyOf(a, f[k]);//实际上需要使用a数组最后的数进行填充tempfor (int i = high + 1; i < temp.length; i++) {temp[i] = a[high];}//使用while来循环处理,找到我们的数keywhile (low <= high) {//只要这个条件满足,就可以找mid = low + f[k - 1] - 1;if (key < temp[mid]) {//说明我们应该继续向数组的前面查找(左边)high = mid - 1;//为什么是k--//说明//1.全部元素=前面的元素+后边元素//2.f[k]=f[k-1]+f[k-2]//因为前面有f[k-1]个元素,所以可以继续拆分f[k-1]=f[k-2]+f[k-3]//即在f[k-1]的前面继续查找k--//即下次循环mid=f[k-1-1]-1k--;} else if (key > temp[mid]) {说明我们应该继续向数组的前面查找(右边)low = mid + 1;//为什么是k-=2//说明//1.全部元素=前面的元素+后边元素//2.f[k]=f[k-1]+f[k-2]//因为后面有f[k-2]个元素,所以可以继续拆分f[k-2]=f[k-3]+f[k-4]//即在f[k-2]的后面继续查找k-=2//即下次循环mid=f[k-1-2]-1k-=2;}else {//找到//需要确定,返回的是哪个下标if(mid<=high){return mid;}else {return high;}}}return -1;//没有找到}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSS.Social微信项目标准库介绍

经过本周的努力&#xff0c;昨晚终于完成OSS.Social微信项目的标准库支持&#xff0c;当前项目你已经可以同时在.net framework和.net core 中进行调用&#xff0c;调用方法也发生了部分变化&#xff0c;这里我简单分享下&#xff0c;主要包含下边几个部分&#xff1a; 移植后…

使用stream进行分页

public class UserService {public List<User> findUserByParamToPage(Integer index,Integer pageSize){UserDao userDao new UserDao();List<User> users userDao.findAll().stream()/*** 过滤address为""的数据*/.filter(user -> !user.getAddres…

ssh(Spring+Spring mvc+hibernate)简单增删改查案例

最近和spring mvc干上了&#xff0c;各种奇葩问题&#xff0c;各种解决。。。现在想想这历程还挺艰辛的&#xff0c;好了&#xff0c;不在这墨迹了&#xff0c;我们进入正题。 据说&#xff0c;现在Springmvc很流行&#xff0c;既然很流行就搞搞它&#xff0c;看看是个什么鬼&…

python把字符串按照指定长度分割_python如何将字符串等长分割

python将字符串等长分割的方法:1、两个一组分割,代码为【b=re.findall(r.{2},aa) 】;2、按照固定长度分割字符串三个字符一组,代码为【re.findall(r.{3}, string)】。 【相关学习推荐:python教程】 python将字符串等长分割的方法: 方法一: 代码示例#!/bin/python #site:W…

js Date 函数方法

转载自 js Date 函数方法 var myDate new Date();myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当…

按小区楼栋单元楼层房间号进行排序-多列字符串提取数字进行排序

多列字符串提取数字进行排序 order by e.community_code, e.estate_id, cast(cour.court_name as UNSIGNED) , cast(b.build_name as UNSIGNED) , cast(u.unit_name as UNSIGNED) ,cast(f.floor_name as UNSIGNED) , cast(a.house_no as UNSIGNED) <select id"ge…

Visual Studio 2017 离线安装方式

Visual Studio&#xff0c; 特别是Visual Studio 2017 通常是一个在线安装程序&#xff0c;如果你在安装过程中失去连接&#xff0c;你可以遇到问题。但是&#xff0c;由于法律原因&#xff0c;微软没有提供完整的可下载的ISO镜像。他们不能将Android安装程序从Google打包到ISO…

小米开发版安装magisk_小米9手机不用解锁安装Magisk工具的教程

也是来把咱们的这个小米9手机的安装Magisk的方法整理一下了&#xff0c;这个Magisk工具也是用到的比较多&#xff0c;今天来说的安装方法是不用刷recovery就可来进行安装了&#xff0c;也是在9.0以上的系统可以用的&#xff0c;不过手机是需要开发版的才行的&#xff0c;如果你…

如何用xshell上宝塔

如何下载xshell7免费版 网盘链接 提取码tmtn 如何连接服务器 第一步 第二步 第三步 第四步 第五步 安装宝塔 直接输入命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh得到 打开浏览…

ssh(Spring+Spring mvc+hibernate)——Emp.hbm.xml

<?xml version"1.0" encoding"utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file au…

Essential MSBuild: .NET 工具生成引擎概述

过去几年大家一直都在使用 .NET Core&#xff08;有这么久吗&#xff1f;&#xff09;并且都知道“生成系统”经历了重大改变&#xff0c;不论是终止对 Gulp 的内置支持&#xff0c;还是放弃 Project.json。对于我这个专栏作家来说&#xff0c;这些变化一直很棘手&#xff0c;因…

单片机中存储器扩展位地址线怎么算_51单片机存储器小结

存储器分为程序存储器(ROM)和数据存储器(RAM)&#xff0c;两种又都可以分为片内和片外&#xff0c;片外即需要自己在单片机外部扩展。8051单片机的片内程序存储器有4K&#xff0c;片内数据存储器有256个字节&#xff0c;其中又分为高128字节位特殊功能寄存器区&#xff0c;真正…

哈希表实现

package com.atguigu.hashtab;import java.nio.file.NotLinkException; import java.sql.SQLOutput; import java.util.Scanner;/*** 创建人 wdl* 创建时间 2021/3/24* 描述*/ public class HashTabDemo {public static void main(String[] args) {//创建哈希表HashTab hashTab…

js深度复制一个对象使用JSON.stringify是最好的办法吗

转载自 js深度复制一个对象使用JSON.stringify是最好的办法吗 深度复制一个对象&#xff0c;看到很多种方法&#xff0c;最简单的是&#xff1a; var newObject JSON.parse(JSON.stringify(oldObject)); 这样写有什么弊端吗&#xff1f; http://stackoverflow.com/quest…

[Java]对double变量进行四舍五入,并保留小数点后位数

[Java]对double变量进行四舍五入&#xff0c;并保留小数点后位数 - 雾霾王者 - 博客园 [Java]对double变量进行四舍五入&#xff0c;并保留小数点后位数 1.功能 将double类型变量进行四舍五入&#xff0c;并保留小数点后位数 2.代码 import java.math.BigDecimal; import ja…

尊贵豪礼:微软2017最有价值专家MVP奖套件开箱图集

IT之家编者按&#xff1a;台湾省某科技网站站长获得了微软2017年度最有价值专家&#xff08;Most Valuable Professional&#xff0c;MVP&#xff09;奖&#xff0c;得奖的领域则是 Windows and Devices for IT。这位站长于是就展示了这份MVP的礼包开箱&#xff0c;从照片上看&…

echart vue 图表大小_vue之将echart封装为组件

最近的新项目里&#xff0c;有大量数据图表类的需求&#xff0c;为了增强代码的复用性&#xff0c;减少冗余&#xff0c;我开始思考如何将echart封装为组件调用。本文将会以雷达图为案例&#xff0c;一步步讲解在vue项目中如何使用echart&#xff0c;如何将其封装为能重复调用的…

ssh(Spring+Spring mvc+hibernate)——Dept.hbm.xml

<?xml version"1.0" encoding"utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file au…

个性化配置你的SQL Server on Linux

问题引入 这天老鸟满面春风找到菜鸟&#xff1a;“鸟儿啊&#xff0c;看你最近研究SQL Server On Linux如鱼得水&#xff0c;干得不错啊。不过呢&#xff0c;这是一个张扬个性的年代&#xff0c;要创新&#xff0c;要与众不同&#xff0c;那你怎么在Linux平台对SQL Server做个性…

idea查看读取的那个nacos配置和yaml配置 naocos 日志

logging.level.com.alibaba.cloud.nacos.client.NacosPropertySourceBuilderdebug