Java与查找算法(3):斐波那契查找

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


Java面试资料
Java面试资料,涵盖:面试前准备,面试经验,面试真题等
链接:Java面试资料,面试准备、面试题,面试真题


一、斐波那契查找

斐波那契查找是一种基于二分查找的查找算法,它使用了斐波那契数列的特性来确定查找点的位置,从而提高了查找效率。斐波那契查找的时间复杂度为O(log n)。

斐波那契查找的基本思想是:将数组分成两个长度分别为F(k)和F(k-1)的子数组,其中F(k)是斐波那契数列中第k个数。然后,将查找点与F(k-1)位置的元素进行比较,如果大于F(k-1)位置的元素,则在F(k)位置的右边继续查找;如果小于F(k-1)位置的元素,则在F(k-1)位置的左边继续查找;如果等于F(k-1)位置的元素,则返回该位置。

具体实现过程如下:

  1. 初始化斐波那契数列:首先,需要初始化一个斐波那契数列,使得数列中的最大值大于等于待查找数组的长度。

  2. 计算查找点的位置:根据斐波那契数列的特性,可以得到F(k) = F(k-1) + F(k-2)。因此,可以使用斐波那契数列中的数来确定查找点的位置。具体实现方式如下:

  • 从斐波那契数列的最大值开始,找到第一个小于等于待查找数组长度的斐波那契数列中的数F(k)。
  • 将待查找数组扩展到F(k)长度,如果扩展部分用0填充,可以将数组中的最后一个元素复制到扩展部分中。
  1. 查找过程:根据待查找元素与查找点的大小关系,可以将数组分成两个子数组,分别为左子数组和右子数组。具体实现方式如下:
  • 如果待查找元素小于查找点的元素,则在左子数组中继续查找,查找范围为[low, mid-1]。
  • 如果待查找元素大于查找点的元素,则在右子数组中继续查找,查找范围为[mid+1, high]。
  • 如果待查找元素等于查找点的元素,则返回查找点的位置。
  1. 查找失败:如果在查找过程中未找到待查找元素,则返回-1。

斐波那契查找是一种基于二分查找的查找算法,它使用了斐波那契数列的特性来确定查找点的位置,从而提高了查找效率。与二分查找相比,斐波那契查找需要预处理斐波那契数列,但是可以减少查找次数,提高查找效率。

二、斐波那契查找的性质

斐波那契查找具有以下几个性质:

  1. 斐波那契查找是一种基于二分查找的查找算法,时间复杂度为O(log n)。

  2. 斐波那契查找的优点是可以减少查找次数,提高查找效率。与二分查找相比,斐波那契查找需要预处理斐波那契数列,但是可以减少查找次数。

  3. 斐波那契查找是一种分治算法,通过将数组分成两个长度分别为F(k)和F(k-1)的子数组,来确定查找点的位置。

  4. 斐波那契查找的查找点位置是根据斐波那契数列中的数来确定的,具有唯一性。

  5. 斐波那契查找的查找点位置可以通过递归实现,也可以通过循环实现。

  6. 斐波那契查找适用于静态查找表,不适用于动态查找表。

斐波那契查找是一种基于二分查找的查找算法,具有减少查找次数、确定查找点位置唯一等特点,适用于静态查找表。

三、斐波那契查找的变种

斐波那契查找的变种有以下两种:

  1. 黄金分割查找:黄金分割查找是斐波那契查找的一种变种,它是将数组分成长度比为黄金分割比例的两个子数组,从而确定查找点的位置。黄金分割比例为0.618,它是斐波那契数列中相邻两个数的比例。黄金分割查找的时间复杂度为O(log n)。

  2. 三分查找:三分查找是一种类似于二分查找的查找算法,它是将数组分成三个部分,分别为左子数组、右子数组和中间子数组,然后根据待查找元素与中间子数组的大小关系,将查找范围缩小到左子数组或右子数组中,从而确定查找点的位置。三分查找的时间复杂度为O(log n)。

斐波那契查找的变种包括黄金分割查找和三分查找,它们都是基于二分查找的查找算法,具有较高的查找效率。

四、Java 实现

下面是Java实现斐波那契查找的示例代码:

public class FibonacciSearch {
    public static int fibonacciSearch(int[] arr, int key) {
        int low = 0;
        int high = arr.length - 1;
        int k = 0; // 斐波那契数列的下标
        int[] fib = generateFibonacciArr(arr.length);

        // 找到大于等于数组长度的最小斐波那契数列元素
        while (arr.length > fib[k] - 1) {
            k++;
        }

        // 将数组扩展到斐波那契数列元素的长度
        int[] temp = Arrays.copyOf(arr, fib[k] - 1);

        // 将扩展部分用数组最后一个元素填充
        for (int i = arr.length; i < temp.length; i++) {
            temp[i] = arr[arr.length - 1];
        }

        // 查找过程
        while (low <= high) {
            int mid = low + fib[k - 1] - 1;
            if (key < temp[mid]) {
                high = mid - 1;
                k -= 1;
            } else if (key > temp[mid]) {
                low = mid + 1;
                k -= 2;
            } else {
                return Math.min(mid, arr.length - 1);
            }
        }

        return -1;
    }

    // 生成斐波那契数列
    private static int[] generateFibonacciArr(int n) {
        int[] fib = new int[n];
        fib[0] = 1;
        fib[1] = 1;
        for (int i = 2; i < n; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        return fib;
    }
}

在上面的代码中,先使用generateFibonacciArr方法生成斐波那契数列,然后根据斐波那契数列的特性确定查找点的位置,最后进行查找。

五、斐波那契查找的应用场景

斐波那契查找适用于静态查找表,即查找表不会发生变化的情况下使用。它的优点是可以减少查找次数,提高查找效率。因此,斐波那契查找的应用场景包括以下几个方面:

  1. 数据量较大,但是不经常变动的静态查找表。

  2. 数据分布比较均匀的查找表。

  3. 数据查找的成功率较高的查找表。

  4. 对查找效率要求较高的场景,例如需要在大数据集中快速查找某个元素的位置。

斐波那契查找适用于静态查找表,对数据分布均匀、查找成功率高、查找效率要求高的场景具有较好的适用性。

六、斐波那契查找在spring 中的应用

在Spring框架中,斐波那契查找并没有被直接应用在某个具体的模块中。不过,Spring框架中的一些模块和组件中可能会使用到斐波那契查找算法,例如:

  1. Spring Data模块中的查询操作:Spring Data是Spring框架中的一个数据访问层框架,它支持多种数据存储技术,包括关系型数据库、NoSQL数据库等。在进行查询操作时,Spring Data可能会使用到斐波那契查找算法,以提高查询效率。

  2. Spring Cache模块中的缓存操作:Spring Cache是Spring框架中的一个缓存管理模块,它支持多种缓存技术,包括内存缓存、Redis等。在进行缓存查找操作时,Spring Cache可能会使用到斐波那契查找算法,以提高缓存查找效率。

  3. Spring Security模块中的用户认证操作:Spring Security是Spring框架中的一个安全管理模块,它提供了多种安全认证和授权机制。在进行用户认证操作时,Spring Security可能会使用到斐波那契查找算法,以提高用户查找效率。

在Spring框架中,斐波那契查找算法可能会被应用在多个模块和组件中,以提高数据访问、缓存查找、用户认证等操作的效率。文章来源地址https://www.toymoban.com/news/detail-460602.html

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

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

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

相关文章

  • 斐波那契算法的理解

    1.斐波那契数列  : 数组:int[] F= {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }; 特点: 从第三个数开始,后边每一个数都是前两个数的和 。 F[k]=F[k-1]+F[k-2]; 如图所示:         ①low、mid、high都是F数组的索引,F[k]-1表示长度。         ②为了方便计算出mid,变形:F[k]-1 = (F[k-1]-1) + (F

    2024年02月08日
    浏览(35)
  • JAVA-斐波那契数列

    输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0 。 数据范围 0≤n≤39 样例

    2024年02月10日
    浏览(36)
  • 【算法】斐波那契数列与台风的故事

    在小岛的一个海滨小镇上,住着一个名叫苏菲的女孩。苏菲一家人靠海为生,她的生活简单而朴素,与大自然和谐共生。每天,苏菲都会来到海边,欣赏那美丽的日出和日落,感受着大海的呼吸。 然而,小岛的美丽风光并非一成不变。每年夏季,热带气旋活跃,台风频繁登陆

    2024年02月10日
    浏览(32)
  • 【算法学习】斐波那契数列模型-动态规划

            我在算法学习过程中,针对斐波那契数列模型的动态规划的例题进行了一个整理,并且根据标准且可靠一点的动态规划解题思路进行求解类似的动归问题,来达到学习和今后复习的必要。         所谓的斐波那契数列模型,即当前状态的值等于前两种状态的值之和。

    2024年02月04日
    浏览(42)
  • 【算法】斐波那契数列通项公式

    如果数列 a n a_n a n ​ 的递推公式: a n = c 1 a n − 1 + c 2 a n − 2 a_n=c_1a_{n-1}+c_2a_{n-2} a n ​ = c 1 ​ a n − 1 ​ + c 2 ​ a n − 2 ​ ------(1) 根据待定系数法,假设 a n − x a n − 1 = y ( a n − 1 − x a n − 2 ) a_n-xa_{n-1}=y(a_{n-1}-xa_{n-2}) a n ​ − x a n − 1 ​ = y ( a n − 1 ​ − x a n − 2 ​

    2023年04月24日
    浏览(36)
  • 算法:动态规划---斐波那契和最短路径

    从本篇开始总结的是动态规划的一些内容,动态规划是算法中非常重要的一个版块,因此也是学习算法中的一个重点,在学习动态规划前应当要把动态规划的基础知识学习一下 动态规划既然是一个新的算法,这个名字也是新名字,那么就要首先明确这个算法的名字代表什么含

    2024年01月25日
    浏览(43)
  • 3-【斐波那契数列模型】LeetCode面试题08.01-三步问题

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

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

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

    2024年02月03日
    浏览(34)
  • 【算法优选】 动态规划之斐波那契数列模型

    动态规划相关题目都可以参考以下五个步骤进行解答: 状态表⽰ 状态转移⽅程 初始化 填表顺序 返回值 后面题的解答思路也将按照这五个步骤进行讲解。 泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2 给你整数 n,请返回第 n 个泰波那契

    2024年02月05日
    浏览(46)
  • C++算法 —— 动态规划(1)斐波那契数列模型

    每一种算法都最好看完第一篇再去找要看的博客,因为这样会帮你梳理好思路,看接下来的博客也就更轻松了。当然,我也会尽量在写每一篇时都可以让不懂这个算法的人也能边看边理解。 动规的思路有五个步骤,且最好画图来理解细节,不要怕麻烦。当你开始画图,仔细阅

    2024年02月10日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包