当前位置: 首页 > article >正文

你好!斐波那契查找【JAVA】

1.有幸遇见

斐波那契查找算法,也称黄金分割查找算法,是一种基于斐波那契数列的查找算法。与二分查找类似,斐波那契查找也是一种有序查找算法,但它的查找点不是中间位置,而是根据斐波那契数列来确定,因此又称为黄金分割查找。

2.原理讲解 

斐波那契(黄金分割法)原理:斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置, mid不再是中间或插值得到,而是位于黄金分割点附近,即mid=low+F(k-1)-1(F代表斐波那契数列)。

注:顺序表长度n不一定刚好等于F[K]-1,所以需要将原来的顺序表长度n增加至F[k]-1。

3.构建斐波那契数组 

 public static int[] fib() {
        int[] f = new int[maxSize];
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i < f.length; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f;
    }

4.痛苦的过程

  /**
     * 斐波那契算法实现
     * @param arr 目标数据
     * @param value 目标数
     * @return 目标数的下标
     */
    public static int fibonacciSearch(int[] arr, int value) {
        int left = 0;
        int right = arr.length - 1;
        int k = 0;//斐波那契分割数值的下标
        int middle = 0;//中间值
        int[] f = fib();//获取斐波那契数列

        //获取斐波那契的下标
        while (right > f[k] - 1) {
            k++;
        }

        //拷贝斐波那契数组
        int[] temp = Arrays.copyOf(arr, f[k]);

        for (int i = right + 1; i < temp.length; i++) {
            temp[i] = arr[right];
        }

        while (left < right) {//终止循环的条件
            middle = left + f[k - 1] + 1;
            if (value < temp[middle]) {//继续向数组的左边查找
                right = middle - 1;
                k--;
            } else if (value > temp[middle]) {//继续向数组的右边查找
                left = middle + 1;
                k -= 2;
            } else {//找到
                if (middle < right) {
                    return middle;
                } else {
                    return right;
                }
            }
        }
        return -1;
    }

 


http://www.kler.cn/news/157312.html

相关文章:

  • 黑猫带你学eMMC协议第31篇:什么是eMMC的驱动强度(Drive Strength)
  • 详解FreeRTOS:软件定时器(高级篇—4)
  • Rust 语言:认识 Rust
  • 考研英语语法(三十九)
  • 合并两个有序链表[简单]
  • UDS 诊断报文格式
  • Vue入门——v-on标签
  • 回溯和分支算法
  • Snagit 2024.0.1(Mac屏幕截图软件)
  • 【五分钟】熟练使用numpy.cumsum()函数(干货!!!)
  • 接口压测指南
  • Spring IOC—基于XML配置和管理Bean 万字详解(通俗易懂)
  • iOS ------ UICollectionView
  • Python —— Mock接口测试
  • ElasticSearch知识体系详解
  • 解码 SQL:深入探索 Antlr4 语法解析器背后的奥秘
  • Web前端 ---- 【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)
  • 10个顶级Linux开源反向代理服务器 - 解析与导航
  • 字节内部自动化测试教程:python+pytest接口自动化-接口测试一般流程及方法
  • CoreDNS实战(一)-构建高性能、插件化的DNS服务器
  • Azure Machine Learning - 使用 REST API 创建 Azure AI 搜索索引
  • 【云备份】项目介绍
  • SoC with CPLD and MCU ?
  • ODN光纤链路全程衰减如何计算
  • d3dx9_43.dll丢失原因以及5个解决方法详解
  • Ubuntu18.04安装Ipopt-3.12.8流程
  • MFC发送ZPL指令控制斑马打印机
  • 代码随想录day5 哈希表part 01 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
  • 【FMC141】基于VITA57.4标准的4通道2.8GSPS 16位DA播放子卡(2片DAC39J84)
  • 股票代码合法验证:python字符串str应用