当前位置:   article > 正文

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

斐波那契查找 java 算法

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

在上面的代码中,先使用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框架中,斐波那契查找算法可能会被应用在多个模块和组件中,以提高数据访问、缓存查找、用户认证等操作的效率。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/852466
推荐阅读
相关标签
  

闽ICP备14008679号