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

这篇具有很好参考价值的文章主要介绍了Java斐波那契查找知识点(含面试大厂题和源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

斐波那契查找(Fibonacci Search)是一种基于斐波那契数列的搜索算法,它在有序数组中查找特定元素。斐波那契查找是二分查找的一种优化版本,它使用斐波那契数列的特性来决定搜索区间的划分,从而减少比较次数。

斐波那契查找的工作原理:

  1. 斐波那契数列:斐波那契查找使用斐波那契数列的特性,即 F(k) = F(k-1) + F(k-2),其中 F(1) = 1F(2) = 1

  2. 确定搜索范围:使用斐波那契数列中的数字来确定搜索区间的大小,使得搜索区间的长度尽可能接近斐波那契数。

  3. 区间划分:选择斐波那契数列中的两个连续数字 F[k-2]F[k-1],其中 F[k-2] 接近于数组的当前搜索范围。将数组的搜索范围划分为三个部分:[0, F[k-2]-2][F[k-2]-1, F[k-1]-2],和 [F[k-1]-1, high]

  4. 查找元素:在这三个区间内进行查找,根据元素的值与中间值的比较结果,逐步缩小搜索范围。

  5. 递归或迭代:使用递归或迭代的方式继续在缩小后的范围内进行搜索,直到找到元素或搜索范围无效。

斐波那契查找的Java实现:

public class FibonacciSearch {
    private static int[] fib = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597};

    public int fibonacciSearch(int[] arr, int x) {
        int n = arr.length;
        int k = 0;
        // Find the index `k` such that fib[k] is just greater than or equal to n
        while (fib[k] < n) {
            k++;
        }

        // Marks the eliminated range from front
        int offset = -1;

        // fib[k-2] is the smallest Fibonacci number greater than or equal to n
        int fibKMinus2 = fib[k - 2];
        int fibKMinus1 = fib[k - 1];

        while (n > 1) {
            // Prevents (n - fibKMinus2) underflow
            int i = Math.min(offset + fibKMinus2, n - 1);

            // Compare `x` with the element at index `i`
            if (arr[i] < x) {
                n = fibKMinus2;
                fibKMinus1 = fibKMinus2;
                fibKMinus2 = fib[k - 3];
                offset = i;
            } else if (arr[i] > x) {
                fibKMinus1 = fib[k - 2];
                fibKMinus2 = fib[k - 3];
                k = 3;
            } else {
                return i;
            }
        }

        // Comparing the last element with `x`
        if (n == 1 && arr[offset + 1] == x) {
            return offset + 1;
        }

        // Element not found
        return -1;
    }

    public static void main(String[] args) {
        FibonacciSearch search = new FibonacciSearch();
        int[] arr = {10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100};
        int x = 85;
        int result = search.fibonacciSearch(arr, x);
        if (result >= 0) {
            System.out.println("Element found at index " + result);
        } else {
            System.out.println("Element not found.");
        }
    }
}

在面试中,斐波那契查找可以作为一个展示你对搜索算法深度理解的话题。通过实现斐波那契查找,可以展示你对算法性能优化的理解和应用能力。希望这些知识点和示例代码能够帮助你更好地准备面试!斐波那契查找是一种在有序数组中查找元素的算法,它利用斐波那契数列的特性来减少搜索次数。以下是三道可能出现在大厂面试中的与斐波那契查找相关的编程题目,以及相应的Java源码实现。

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

描述
实现斐波那契查找算法,用于在有序数组中查找特定元素。

示例

输入: arr = [1, 3, 7, 10, 15, 20], x = 7
输出: 2

Java 源码

public class FibonacciSearch {
    private static final int[] fib = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};

    public int fibonacciSearch(int[] arr, int x) {
        int n = arr.length;
        int fibMMm2 = 0;
        int fibMMm1 = 1;
        int fibM = fibMMm2 + fibMMm1;

        // 获取大于或等于 n 的最小斐波那契数
        while (fibM < n) {
            fibMMm2 = fibMMm1;
            fibMMm1 = fibM;
            fibM = fibMMm2 + fibMMm1;
        }

        // 标记斐波那契数列中的两个连续数字
        int offset = -1;

        // 初始化 fibonacci 索引的前两个元素
        int i = fibMMm2;

        // 斐波那契查找
        while (i < n) {
            if (arr[i] < x) {
                // 减小搜索范围的上限
                offset = i;
                fibM = fibMMm1;
                fibMMm1 = fibMMm2;
                fibMMm2 = fibM - fibMMm1;
                i = offset + fibMMm1;
            } else if (arr[i] > x) {
                // 减小搜索范围的下限
                fibM = fibMMm1;
                fibMMm1 = fibMMm2;
                fibMMm2 = fibM - fibMMm1;
                i = fibMMm2 + offset + 1;
            } else {
                // 找到元素,返回索引
                return i;
            }
        }

        // 元素不在数组中,返回-1
        return -1;
    }

    public static void main(String[] args) {
        FibonacciSearch solution = new FibonacciSearch();
        int[] arr = {1, 3, 7, 10, 15, 20};
        int x = 7;
        int result = solution.fibonacciSearch(arr, x);
        System.out.println("Index of " + x + ": " + result);
    }
}

题目 2:斐波那契查找优化

描述
在斐波那契查找中,如果数组中的元素数量不是斐波那契数,算法的性能会有所下降。请实现一种优化,使得算法在任何数组大小下都能达到最佳性能。

示例

输入: arr = [2, 3, 4, 5, 6, 7, 8, 10], x = 5
输出: 4

Java 源码

// 优化版本的斐波那契查找与题目 1 类似,需要在查找前对数组大小进行调整或使用其他方法来优化性能。

题目 3:斐波那契查找与二分查找的比较

描述
给定一个足够大的有序数组,比较斐波那契查找和二分查找在该数组上的性能。实现两种查找算法,并给出你的分析。

示例

// 性能比较通常需要实际运行算法并测量运行时间,因此这里不提供具体的输出示例。

Java 源码

// 实现二分查找和斐波那契查找,并在给定数组上运行这两种算法,比较它们的性能。

这些题目和源码展示了斐波那契查找在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!文章来源地址https://www.toymoban.com/news/detail-857272.html

到了这里,关于Java斐波那契查找知识点(含面试大厂题和源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3-【斐波那契数列模型】LeetCode面试题08.01-三步问题

    题目 三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。 示例1: 输入:n = 3  输出:4 说明: 有四种走法 示例2: 输入:n = 5 输出:13 提示:n范围在[1, 1000

    2024年02月05日
    浏览(40)
  • C语言例题(二维数组)【转置矩阵】【成绩登记】【斐波那契】【简单矩阵查找】【螺旋数阵】【一维数组转二维数组】

    例一:转置矩阵 程序: 输出:通过b[j][i] = a[i][j];这一步实现了转置 进阶:用6个1~20内的随机数按行的顺序生成一个a[2][3]的矩阵,并输出它的转置矩阵 输出: 例2.登记某班三人的数学、英语两门课程的成绩。 分析:此类问题可以通过使用3个一维数组来解决,也可以通过使用

    2024年02月03日
    浏览(45)
  • Java【动态规划】斐波那契数列模型, 图文思路详解 + 代码实现

    本篇总结动态规划中的 斐波那契数列模型 的解法和思路 按照以下流程进行分析题目和代码编写 思路分析步骤 代码编写步骤 1, 状态表示 1, 构造 dp 表 2, 状态转移方程 2, 初始化+边界处理 3, 初始化 3, 填表(抄状态转移方程) 4, 填表顺序 4, 返回结果 5, 返回值 / OJ链接 题目分析

    2024年02月08日
    浏览(59)
  • Java数据结构与算法:动态规划之斐波那契数列

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编。在这寒冷的季节里,让我们一同探讨Java中的动态规划,重点关注解决问题的经典代表之一——斐波那契数列。 动态规划简介 动态规划是一种解决问题的数学方法,通常用于优化递归算法。它通过将问

    2024年01月22日
    浏览(47)
  • 手撕前端面试题【javascript~ 总成绩排名、子字符串频次统计、继承、判断斐波那契数组等】

    html页面的骨架,相当于人的骨头,只有骨头是不是看着有点瘆人,只有HTML也是如此。 css,相当于把骨架修饰起来,相当于人的皮肉。 js(javascripts),动起来,相当于人的血液,大脑等一切能使人动起来的器官或者其他的。 在刷题之前先介绍一下牛客。Leetcode有的刷题牛客都有,

    2024年01月15日
    浏览(45)
  • 斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题

    Write once,Runanywhere. 🔥🔥🔥 本派文章详细斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题。 💥 💥 💥 如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!! 💥 💥 💥 ⚡ 版权声明:本文由【马上回来了】原创、

    2023年04月08日
    浏览(67)
  • Java 面试知识点

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的 语法,集合的语法,io 的语法,虚拟机方面的语法。 和都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否

    2024年02月16日
    浏览(42)
  • java面试常见知识点

    JDK(Java Development Kit)是Java开发工具包,是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JRE是运行基于Java语言编写的程序所不可缺少的运行环境。JRE中包含了JVM,runtime class libraries和Jav

    2024年02月11日
    浏览(56)
  • Java面试知识点(全)- Java面试基础部分一

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联

    2024年02月05日
    浏览(46)
  • 【动态规划】是泰波那契数,不是斐波那契数

    Problem: 1137. 第 N 个泰波那契数 首先我们来解读一下本题的意思🔍 相信读者在看到【泰波那契数】的时候,不禁会联想到【斐波那契数】,它们呢是一对孪生兄弟,这个 泰波那契数 相当于是 斐波那契数 的加强版 我们首先可以来看到这个递推公式 Tn+3 = Tn + Tn+1 + Tn+2 ,读者可

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包