java 斐波那契查找,涵盖原理、算法分析、实现细节、优缺点、应用场景等

news2025/1/5 7:11:54

一、定义

斐波那契查找(Fibonacci Search)是一种基于斐波那契数列的查找算法,适用于已排序的数组。它利用斐波那契数列的性质来减少比较次数,并且能够在某些条件下比二分查找更快。
在这里插入图片描述
更多优质资源推荐:
http://sj.ysok.net/jydoraemon 访问码:JYAM

二、基本思想

斐波那契查找通过使用斐波那契数列来划分数组,并通过计算斐波那契数的比例来确定查找位置。这种方法减少了对数组的访问次数,从而提高查找效率。

三、基本原理

  1. 斐波那契数列:Fibonacci数列是由0和1开始,后续每个数都是前两个数之和的序列。即:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)。
  2. 查找范围:将数组分为两部分,通过斐波那契数列的比例来确定分割位置,并递归地在其中一个部分查找目标值。
  3. 逐步缩小范围:每次查找后,根据目标值与当前元素的比较,更新查找范围,直到找到目标值或范围无效。

四、工作流程

  1. 计算斐波那契数列,直到它大于或等于数组的长度。
  2. 使用斐波那契数列的值来确定分割位置。
  3. 比较目标值与当前元素:
    • 如果相等,返回当前索引。
    • 如果小于当前元素,调整范围,使用前两个斐波那契数的值。
    • 如果大于当前元素,调整范围,使用前一个斐波那契数的值,并更新偏移量。
  4. 重复以上步骤,直到找到目标值或范围无效。

五、伪代码

function fibonacciSearch(array, target):
    n = length(array)
    fibM2 = 0 // (m-2)th Fibonacci number
    fibM1 = 1 // (m-1)th Fibonacci number
    fibM = fibM1 + fibM2 // mth Fibonacci number

    // Find the smallest Fibonacci number greater than or equal to n
    while fibM < n:
        fibM2 = fibM1
        fibM1 = fibM
        fibM = fibM1 + fibM2

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

    while fibM > 1:
        i = min(offset + fibM2, n - 1)

        if array[i] < target:
            fibM = fibM1
            fibM1 = fibM2
            fibM2 = fibM - fibM1
            offset = i
        else if array[i] > target:
            fibM = fibM2
            fibM1 = fibM1 - fibM2
            fibM2 = fibM - fibM1
        else:
            return i // Found target

    // Comparing the last element
    if fibM1 and array[offset + 1] == target:
        return offset + 1

    return -1 // Target not found

六、实现(Java代码)

public class FibonacciSearch {
    public static int fibonacciSearch(int[] array, int target) {
        int n = array.length;
        int fibM2 = 0; // (m-2)th Fibonacci number
        int fibM1 = 1; // (m-1)th Fibonacci number
        int fibM = fibM1 + fibM2; // mth Fibonacci number

        // Find the smallest Fibonacci number greater than or equal to n
        while (fibM < n) {
            fibM2 = fibM1;
            fibM1 = fibM;
            fibM = fibM1 + fibM2;
        }

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

        // Main loop
        while (fibM > 1) {
            int i = Math.min(offset + fibM2, n - 1);

            // Compare target with the value at index i
            if (array[i] < target) {
                fibM = fibM1;
                fibM1 = fibM2;
                fibM2 = fibM - fibM1;
                offset = i; // Move to the right
            } else if (array[i] > target) {
                fibM = fibM2;
                fibM1 = fibM1 - fibM2;
                fibM2 = fibM - fibM1; // Move to the left
            } else {
                return i; // Found target
            }
        }

        // Comparing the last element
        if (fibM1 == 1 && array[offset + 1] == target) {
            return offset + 1;
        }

        return -1; // Target not found
    }

    public static void main(String[] args) {
        int[] numbers = {10, 22, 35, 40, 45, 50, 80, 82, 85, 90}; // Example array (sorted)
        int target = 85; // The target value to search
        int result = fibonacciSearch(numbers, target);

        // Output the result
        if (result != -1) {
            System.out.println("Element " + target + " found at index: " + result);
        } else {
            System.out.println("Element " + target + " not found.");
        }
    }
}

七、代码分析讲解

  • 函数定义fibonacciSearch函数接收一个已排序的整数数组array和一个目标值target
  • 斐波那契数初始化:初始化斐波那契数列的前两个值,并计算出第一个大于或等于数组长度的斐波那契数。
  • 查找逻辑:使用while循环,通过斐波那契数列逐步缩小查找范围,直到找到目标值或范围无效。
  • 位置调整:根据目标值与当前元素的比较,不断调整斐波那契数和偏移量。
  • 最后比较:在循环结束后,对最后一个元素进行比较,以确定目标值是否存在。

八、复杂度分析

  • 时间复杂度:O(log n)
    • 斐波那契查找的时间复杂度与二分查找相似,但在某些情况下,因其计算方式,可能会更快。
  • 空间复杂度:O(1)
    • 只使用了常量级的额外空间,避免了使用额外的数据结构。

九、稳定性

斐波那契查找是稳定的,因为它不会改变数组中元素的相对顺序。在查找过程中,仅进行索引查找和比较,不涉及修改操作。

十、优缺点

优点

  • 在某些情况下,查找效率高于二分查找,尤其是在大规模的均匀分布数据中。
  • 实现相对简单,逻辑清晰。

缺点

  • 仅适用于已排序的数组,且在数据分布不均时效率可能不如二分查找。
  • 对于小规模数据,性能优势不明显。

十一、实际应用

  • 查找问题:在已排序的大型数据集(如数据库索引)中查找元素索引。
  • 频繁查找:在数据集较大且查找频繁的场景中,斐波那契查找提供了高效的解决方案。
  • 数据分析:在分析均匀分布的数据时,斐波那契查找能够快速定位目标值。

十二、总结

斐波那契查找是一种高效的查找算法,适用于已排序的数组。通过利用斐波那契数列的性质,它能够减少比较次数,从而提高查找效率。尽管其适用范围有限,但在合适的场景下,斐波那契查找能够显著提高查找效率,是计算机科学中重要的基础算法之一。了解其适用条件和局限性,对于高效编程至关重要。

更多优质资源推荐:
http://sj.ysok.net/jydoraemon 访问码:JYAM

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

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

相关文章

内网学习:工作组用户与权限

目录 一、本地用户组介绍本地工作组介绍用户与组的关系 二、四种用户类型及权限比较本地系统最高权限&#xff08;System账户&#xff09;特性Administrator与System账户的区别 本地最高管理员&#xff08;Administrator用户&#xff09;特性 本地普通管理员特性 本地普通用户特…

图片转成oled使用的字模数据

目录 oled尺寸 如何生成用到的图片 图片转字模 1.首先用Img2Lcd转成bmp单色图片 2.然后用PCtoLCD2002把单色图片转字模 oled尺寸 我使用0.96寸oled模块&#xff0c;对应着的分辨率是128*64&#xff0c;对应着宽高像素比128*64。所以不是随意一张图片就能用的&#xff0c;…

PTPVT 插值说明

文章目录 PTPVT 插值说明 PTPVT 插值说明PVT Hermite插值PVT 三次多项式插值PT 插值Sin轨迹测试结果PVT Hermite插值结果PVT 三次多项式插值结果PT 插值结果 用户轨迹测试结果PVT Hermite插值结果PT 插值结果 PTPVT 插值说明 PT模式&#xff1a; 位置-时间路径插值算法。 PVT模…

Mac安装多个版本node、java、python 等开发软件环境,安装、卸载、升级多个数据库

安装多个版本node、java、python 等开发软件环境 使用nvm&#xff08;Node.js Version Manager&#xff09;来管理多个Node.js版本。 使用jenv来管理多个Java版本。 使用pyenv来管理多个Python版本。 以下是安装和使用这些版本管理器的基本步骤&#xff1a; 1. 安装多个版本…

【深度学习】卷积网络代码实战ResNet

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

添砖java第四更@(+)@

今天的学习内容主要是围绕着实体类来进行的&#xff0c;就是说在java里面我们常常会把数据存放和方法分别存放在不同的类里面。 首先就是关于实体类是什么&#xff0c;实体类就是只提供了get方法,set方法,和默认构造器的类。 接着就是熟悉java与别的语言的不同之处就在于它是…

算法题(19):多数元素

审题&#xff1a; 数组不为空且一定存在众数。需要返回众数的数值 思路&#xff1a; 方法一&#xff1a;哈希映射 先用哈希映射去存储对应数据出现的次数&#xff0c;然后遍历找到众数并输出 当然也可以在第一次映射的过程中就维护一个出现次数最多的数据&#xff0c;这样子就可…

电子商务网站的三层架构的理解和实践

在电子商务领域&#xff0c;网站架构的设计对于系统的稳定性、可扩展性和用户体验至关重要。其中&#xff0c;三层架构作为一种经典的设计模式&#xff0c;被广泛应用于各类电子商务网站中。本文将从理论、理解和实践三个方面&#xff0c;详细探讨电子商务网站的三层架构。 一、…

LVS 负载均衡原理 | 配置示例

注&#xff1a;本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时&#xff0c;可以看看原理实现。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写&#xff0c;翻译成中文就是负…

JavaScript甘特图 dhtmlx-gantt

背景 需求是在后台中&#xff0c;需要用甘特图去展示管理任务相关视图&#xff0c;并且不用依赖vue&#xff0c;兼容JavaScript原生开发。最终使用dhtmlx-gantt&#xff0c;一个半开源的库&#xff0c;基础功能免费&#xff0c;更多功能付费。 甘特图需求如图&#xff1a; 调…

领域驱动设计第一篇-DP主题

一&#xff1a;领域驱动设计概述 领域驱动设计。Domain-Driven Design 可以理解为基于领域的工程设计。 1&#xff1a;什么是领域&#xff1f; 初步理解领域&#xff1a;业务问题的范畴。 领域可大可小&#xff0c;对应着大小业务问题的边界。业务上要做的几个事&#xff0…

EMNLP'24 最佳论文解读 | 大语言模型的预训练数据检测:基于散度的校准方法

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 张伟超&#xff0c;中国科学院计算所网络数据科学与技术重点实验室三年级直博生 内容简介 近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;的…

IntelliJ IDEA 远程调试

IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时&#xff0c;在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下&#xff0c;我们会通过打 Log 或者 Debug 的方式去定位并解决问题&#xff0c;两种方式各有利弊&#xff0c;今天就简要介绍下如何通过远程 Debug 的情况下…

【Webug】攻防实战详情

世界上只有一种真正的英雄主义&#xff0c;那就是认清了生活的真相后&#xff0c;仍然热爱她 显错注入 首先整体浏览网站 注入点&#xff1a; control/sqlinject/manifest_error.php?id1 判断注入类型 输入: and 11 正常, 再输入: and 12 还正常, 排除数字型 输入单引号:…

SpringMVC核心、两种视图解析方法、过滤器拦截器 “ / “ 的意义

SpringMVC的执行流程 1. Spring MVC 的视图解析机制 Spring MVC 的核心职责之一是将数据绑定到视图并呈现给用户。它通过 视图解析器&#xff08;View Resolver&#xff09; 来将逻辑视图名称解析为具体的视图文件&#xff08;如 HTML、JSP&#xff09;。 核心流程 Controlle…

CyclicBarrier线程辅助类的简单使用

文章目录 简述内部机制构造函数使用案例异常处理 简述 CyclicBarrier 是另一个用于协调多个线程之间操作的同步辅助类&#xff0c;它允许一组线程互相等待彼此到达一个共同的屏障点&#xff08;barrier&#xff09;。与 CountDownLatch 不同的是&#xff0c;CyclicBarrier 可以…

B站推荐模型数据流的一致性架构

01 背景 推荐系统的模型&#xff0c;通过学习用户历史行为来达到个性化精准推荐的目的&#xff0c;因此模型训练依赖的样本数据&#xff0c;需要包括用户特征、服务端推荐的视频特征&#xff0c;以及用户在推荐视频上是否有一系列的消费行为。 推荐模型数据流&#xff0c;即为…

无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构

文章链接&#xff1a;https://arxiv.org/pdf/2412.18597 项目链接&#xff1a;https://github.com/TencentARC/DiTCtrl 亮点直击 DiTCtrl&#xff0c;这是一种基于MM-DiT架构的、首次无需调优的多提示视频生成方法。本文的方法结合了新颖的KV共享机制和隐混合策略&#xff0c;使…

尔湾市圣诞节文化交流会成功举办,展示多元文化魅力

洛杉矶——12月21日,圣诞节文化交流会在尔湾成功举办。圣诞节文化交流会旨在促进不同文化之间的交流与理解。通过举办舞蹈表演、演讲和互动游戏等,为参与者提供了一个展示和欣赏多元文化艺术的平台。这些活动不仅增加了社区成员之间的互动,也加深了他们对不同文化传统和艺术形式…

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…