Java斐波那契查找知识点(含面试大厂题和源码)

斐波那契查找(Fibonacci Search)是一种在有序数组中查找元素的高效算法,它基于斐波那契数列的性质。斐波那契查找是二分查找的一种改进,通过使用斐波那契数列来确定搜索范围,可以在某些情况下减少比较次数,特别是在数组较大时表现更为出色。

以下是斐波那契查找的一些关键知识点:

  1. 斐波那契数列:

    • 斐波那契数列是一个递归数列,其中每个数字是前两个数字的和,即F(n) = F(n-1) + F(n-2),起始值为F(0) = 0F(1) = 1
    • 数列的前几个数字是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …。
    • 斐波那契数列的一个特性是,对于任意大于2的n,F(n)都大于F(n-1) + F(n-2)
  2. 斐波那契查找的原理:

    • 斐波那契查找的基本思想是利用斐波那契数列的特性来确定搜索区间的边界。
    • 算法从最小的斐波那契数开始,该数小于或等于数组的长度,并尝试找到一个大于或等于给定值的元素。
    • 如果找不到,算法会递减到前两个斐波那契数,并继续搜索。
  3. 算法步骤:

    • 初始化两个斐波那契数FibMMm2FibMM1,其中FibMMm2是大于或等于数组长度的最小斐波那契数,FibMM1是其前一个斐波那契数。
    • 计算偏移量offset,使得FibMM1 - offset是小于或等于数组长度的最大斐波那契数。
    • 根据偏移量和给定值在数组中计算一个索引i,并与数组中的元素进行比较。
    • 如果找到元素,则返回索引;如果给定值较大,则在右侧子数组中继续查找;如果给定值较小,则在左侧子数组中查找。
    • 重复上述步骤,直到找到元素或区间缩小到0。
  4. 时间复杂度:

    • 斐波那契查找的时间复杂度大约是O(log n),其中n是数组的长度。
    • 由于斐波那契数列的增长速度比二分查找中的2的幂次方慢,因此在大型数组中斐波那契查找可能比二分查找更快。
  5. 实现要点:

    • 需要一个函数来生成斐波那契数列,或者预先计算出一定范围内的斐波那契数。
    • 在查找过程中,需要仔细处理边界条件和偏移量的计算。
  6. 适用场景:

    • 斐波那契查找适用于大型有序数组的查找问题。
    • 当数组的大小经常变化时,斐波那契查找可能不如二分查找高效,因为每次数组大小变化后都需要重新计算斐波那契数列。

通过掌握上述知识点,你可以有效地理解和实现斐波那契查找算法,并在需要时将其应用于解决实际问题。在面试中,你可能需要解释算法的工作原理、时间复杂度和适用场景,以及与二分查找的比较。

题目 1:实现斐波那契查找算法

描述
给定一个有序数组和一个目标值,使用斐波那契查找算法找到目标值在数组中的位置。如果目标值不在数组中,返回-1。

要求

  • 有序数组中的元素可以是任何类型,但比较操作应该是有效的。
  • 考虑到斐波那契数列的特性,算法应该尽量减少不必要的比较。

Java代码示例

import java.util.Arrays;public class FibonacciSearch {public static int fibonacciSearch(int[] arr, int x) {int fibMMm2 = 0, fibMM1 = 1, fibM = fibMMm2 + fibMM1;int offset = -1;// 找到小于等于数组长度的最大斐波那契数while (fibM < arr.length) {fibMMm2 = fibMM1;fibMM1 = fibM;fibM = fibMMm2 + fibMM1;}// 计算偏移量offset = (fibMM1 - 1) % arr.length;if (offset == 0) offset = arr.length;// 从最后一个斐波那契数开始查找for (int i = offset; i < arr.length; i++) {if (arr[i] == x) return i;}// 在前两个斐波那契数对应的区间内查找while (fibMM1 > 1) {if (arr[(i - fibMM2) % arr.length] == x) return (i - fibMM2 + offset) % arr.length;fibM = fibMM1 + fibMM2;fibMM2 = fibMM1;fibMM1 = fibM % arr.length;}return -1; // 如果没有找到目标值}public static void main(String[] args) {int[] arr = {10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100};int x = 85;int result = fibonacciSearch(arr, x);System.out.println("Element found at index: " + result);}
}

题目 2:找到有序数组中的倒数第二个元素

描述
给定一个有序数组(可能包含重复元素),找到数组中的倒数第二个元素。

要求

  • 不使用数组的内置方法,如lastIndexOf
  • 考虑到数组可能非常大,算法应该尽量减少不必要的比较和操作。

Java代码示例

public class SecondLastElement {public static int findSecondLast(int[] arr) {if (arr == null || arr.length < 2) {throw new IllegalArgumentException("Array should have at least two elements.");}int secondLast = -1;for (int i = 0; i < arr.length; i++) {if (i < arr.length - 2) {if (arr[i] != arr[i + 1]) {secondLast = arr[i];}} else {return secondLast;}}return secondLast;}public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 5, 5, 6, 7};System.out.println("Second last element is: " + findSecondLast(arr));}
}

题目 3:验证一个字符串是否为另一个字符串的旋转

描述
给定两个字符串,验证字符串B是否可以由字符串A旋转得到(例如,“waterbottle”旋转后可以变成“erbottlewat”,但“waterbottle”不能旋转成“bottlewater”)。

要求

  • 不使用额外的空间。
  • 考虑到字符串可能非常长,算法应该尽量减少不必要的操作。

Java代码示例

public class StringRotation {public static boolean isRotation(String A, String B) {if (A == null || B == null || A.length() != B.length()) {return false;}int count = 0;for (int i = 0; i < A.length(); i++) {if (A.charAt(i) == B.charAt(0)) {count++;}}// 如果A中B的首字符出现次数是A的长度,说明B是A的旋转return count == A.length();}public static void main(String[] args) {String A = "waterbottle";String B = "erbottlewat";System.out.println("Is B a rotation of A? " + isRotation(A, B));}
}

在面试中,除了提供解决方案的代码,还应该准备好解释你的算法思路、时间复杂度和空间复杂度。此外,讨论可能的边界情况和异常处理也是非常重要的。

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

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

相关文章

代码随想录算法训练营第三十二天| 122.买卖股票的最佳时机II , 55. 跳跃游戏, 45.跳跃游戏II

题目与题解 122.买卖股票的最佳时机II 题目链接&#xff1a;122.买卖股票的最佳时机II 代码随想录题解&#xff1a;122.买卖股票的最佳时机II 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1a;122.买卖股票最佳时机II_哔哩哔哩_bilibili 解题思…

MySQL一条SQL语句的执行过程

MySQL一条SQL语句的执行过程可以大致分为以下几个步骤&#xff1a; mysq分层架构 为了理解这个问题&#xff0c;先从Mysql的架构说起&#xff0c;对于Mysql来说&#xff0c;大致可以分为3层架构。 网络连接层&#xff1a; 作为客户端和服务端的连接&#xff0c;连接器负责处…

Leetcode 17.电话号码的字母组合

题目 思路 输入的digits有几个数就有几层。 一层中有几个数则取决于输入的数字对应的字母有几个。 1.确定递归函数的返回值及参数&#xff1a; 其实参数不是一开始就确定好的&#xff0c;而是你在写递归函数的时候缺啥&#xff0c;就往进去传啥。 这里我就直接全部写出来。…

无线基本认识和配置

1、无线局域网 IEEE 802.11标准 根据应用范围分类 WPAN --- 个人无线网络 NFC、ZIgbee、Bluetooth WLAN --- 无线局域网 WiFi&#xff0c;使用到WPAN技术 WMAN --- 无线城域网 WiMax 802.16 WWAN --- 无线广域网 GSM、CDMA、WCDMA、LTE、5G、TD-SCDMA 2、…

2012年认证杯SPSSPRO杯数学建模C题(第一阶段)碎片化趋势下的奥运会商业模式全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 C题 碎片化趋势下的奥运会商业模式 原题再现&#xff1a; 从 1984 年的美国洛杉矶奥运会开始&#xff0c;奥运会就不在成为一个“非卖品”&#xff0c;它在向观众诠释更高更快更强的体育精神的同时&#xff0c;也在攫取着巨大的商业价值&#…

【leetcode面试经典150题】11.H指数(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

关东升老师力作!四本编程宝典,带你畅游编程世界

&#x1f31f;《看漫画学C》&#xff1a;关东升老师以漫画的形式&#xff0c;让你在欢笑中轻松掌握C编程的核心知识。不再枯燥&#xff0c;不再难懂&#xff0c;让编程变得有趣又简单&#xff01; &#x1f3a8;《MATLAB科研绘图与学术图表绘制从入门到精通》&#xff1a;关东升…

数学中的各种符号虚数概念

max i∈S​A i ​ ≥ ∑ i∈S​B i​. 这个不等式表达的意思是对于集合 S 中的任意非空子集&#xff0c;子集中的最大的 A_i&#xff08;A 的元素&#xff09;的值都大于等于子集中所有 B_i&#xff08;B 的元素&#xff09;的值的总和。换句话说&#xff0c;集合 S 中的最大…

c++的学习之路:15、list(2)

本章主要是讲模拟实现list&#xff0c;文章末附上代码。 目录 一、创建思路 二、构造函数 三、迭代器 四、增删 五、代码 一、创建思路 如下方代码&#xff0c;链表是由一块一块不连续的空间组成的&#xff0c;所以这里写了三个模板&#xff0c;一个是节点&#xff0c;一…

koc和kol是什么意思?

一、koc和kol是什么意思&#xff1f; koc和kol是专业术语。KOC是关键意见消费者的意思&#xff0c;是Key Opinion Consumer的缩写&#xff1b;KOL是关键意见领袖的意思&#xff0c;是Key Opinion Leader的缩写。 1、关键意见领袖kol “关键意见领袖”通俗地讲是达人。这些人…

应用开发:python解析斗鱼弹幕

解决问题 互动弹幕&#xff0c;关注提问 &#xff0c;ai回答 技术 python playwright 调用接口 https://github.com/broven/DouYudanmu/blob/master/douyu.py 演示 放弃 这个根本不是研究方向 定位错误 你浪费下午时间&#xff0c;定位错误 这个跟本不是你的方向。 4个小时看斗…

OMP实现压缩感知的实现(MATLAB)

本文介绍通过DWT和OMP实现压缩感知。 不同的是,将DWT得到的低频放到了作为稀疏矩阵的顶部。 压缩感知 压缩感知算法是一种用于从高维度数据中恢复稀疏信号的方法。它通常用于处理信号的采样和重建,例如图像或音频。以下是压缩感知算法的一般实现细节: 信号表示: 压缩感知算…

蓝桥杯第六届c++大学B组详解

前言&#xff1a; 看了很多博客以及视频讲解&#xff0c;感觉都不是很清楚&#xff0c;比较模棱两可&#xff0c;所以干脆自己一边想&#xff0c;一边写博客&#xff0c;也可帮助到其他人&#xff0c;都是根据自己的逻辑来尽量清楚简单的讲清楚题目&#xff0c;喜欢的不要吝啬三…

计算机笔记(4)续20个

61.指出CPU下一次要执行的指令的地址的部件称为程序计数器 62.动态随机存储器&#xff0c;最为常见的系统内存&#xff0c;即DRAM。DRAM只能将数据保持很短的时间。为了保持数据&#xff0c;DRAM使用电容存储&#xff0c;所以必须隔一段时间刷新一次&#xff0c;如果存储单元没…

Python数据分析十六

一、Python的字典的操作方法popitem和setdefault 当你使用Python中的字典数据类型时&#xff0c;可能会经常用到一些操作方法&#xff0c;比如popitem()和setdefault()。下面我将为你详细讲解这两个方法&#xff0c;并给出相应的代码示例。 1.popitem()方法&#xff1a; pop…

HTTP的介绍

一.什么是HTTP&#xff1f; Hyper Text Transfer Protocol,超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 二.HTTP的特点 &#xff08;1&#xff09;基于TCP协议&#xff1a;面向连接&#xff0c;安全 &#xff08;2&#xff09;基于请求-响应模型的&…

卡奥斯工业互联网平台分析

一、 背景 卡奥斯是海尔推出的具有中国自主知识产权、全球首家引入用户全流程参与体验的工业互联网平台。其核心是大规模定制模式&#xff0c;通过持续与用户交互&#xff0c;将硬件体验变为场景体验&#xff0c;将用户由被动的购买者变为参与者、创造者&#xff0c;将企业由原…

违法解除劳动合同后【股票争议】——案例学习

目录 结论&#xff1a;不统一 观点一&#xff1a; 不属于劳动争议 观点二&#xff1a; 属于劳动争议 股权激励收益是否属于劳动报酬应结合以下要素综合判断&#xff1a; 股权激励收益应属于劳动报酬 问题&#xff1a;违法解除劳动合同后&#xff0c;涉股权激励争议是否属于…

【1】初识 Python

【1】初识 Python 1、编程语言(1) 语言(2) 编程语言(3) 如何利用编程语言与计算机交流(4) 常见的编程语言(5) 语法 2、Python 简介(1) 什么是 Python(2) Python 能做什么(3) Python 的由来(4) Python的特点① 语法精简② 生态好&#xff0c;开发效率高③ Python开发初体验&…

练习 21 Web [GXYCTF2019]BabySQli

SQL联合查询&#xff0c;注意有源码看源码&#xff0c;Base64以及32的区别&#xff0c;MD5碰撞 打开后有登录框&#xff0c;先随意登录尝试 只有输入admin才是返回wrong pass&#xff01; 其他返回wrong user 所以用户名字段一定要输入admin 养成好习惯&#xff0c;先查看源码…