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

插值查找和斐波那契查找

插值查找(Interpolation Search)

插值查找是一种改进的二分查找,适用于均匀分布的有序数组。它通过预测要查找的值可能的位置来减少搜索次数。

public class InterpolationSearch {
    public static int interpolationSearch(int[] arr, int target) {
        int left = 0, right = arr.length - 1;
        while (left <= right && target >= arr[left] && target <= arr[right]) {
            // 计算插值位置
            int pos = left + ((target - arr[left]) * (right - left)) / (arr[right] - arr[left]);
            
            if (arr[pos] == target) {
                return pos;
            }
            if (arr[pos] < target) {
                left = pos + 1;
            } else {
                right = pos - 1;
            }
        }
        return -1; // 未找到
    }

    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50, 60, 70, 80, 90};
        int target = 50;
        int index = interpolationSearch(arr, target);
        System.out.println(index == -1 ? "未找到" : "找到索引: " + index);
    }
}

斐波那契查找(Fibonacci Search)

斐波那契查找基于斐波那契数列来划分搜索区域,适用于数据量大、顺序存储、访问代价较高的场景(如磁盘存储)。

import java.util.Arrays;

public class FibonacciSearch {
    
    // 获取斐波那契数列
    public static int[] fibonacci(int size) {
        int[] fib = new int[size];
        fib[0] = 0;
        fib[1] = 1;
        for (int i = 2; i < size; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        return fib;
    }

    public static int fibonacciSearch(int[] arr, int target) {
        int n = arr.length;
        int fibSize = 20; // 预设的斐波那契数列大小
        int[] fib = fibonacci(fibSize);

        // 找到最小的斐波那契数,使其大于等于 n
        int k = 0;
        while (fib[k] < n) {
            k++;
        }

        // 创建扩展数组
        int[] temp = Arrays.copyOf(arr, fib[k]); // 长度扩展至 fib[k]
        for (int i = n; i < fib[k]; i++) {
            temp[i] = arr[n - 1]; // 用最大元素填充
        }

        int left = 0;  // 左边界
        int right = n - 1;  // 右边界

        while (left <= right) {
            int mid = left + fib[k - 2] - 1; // 计算 mid 位置

            if (temp[mid] < target) { 
                left = mid + 1;
                k -= 1; // 右移 k-1
            } else if (temp[mid] > target) {
                right = mid - 1;
                k -= 2; // 左移 k-2
            } else {
                return (mid < n) ? mid : -1; // 防止访问填充部分
            }
        }
        return -1; // 未找到
    }

    public static void main(String[] args) {
        int[] arr = {10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100};
        int target = 50;
        int index = fibonacciSearch(arr, target);
        System.out.println(index == -1 ? "未找到" : "找到索引: " + index);
    }
}


🔹 区别与适用场景

查找方法    适用场景    时间复杂度    额外空间    适合数据
插值查找    数据分布均匀    平均 O(log log n),最坏 O(n)    O(1)    均匀分布的大规模数据
斐波那契查找    访问代价高的有序数据    O(log n)    O(1)    需要减少访问次数的场景
🎯 总结:

插值查找更快,但对数据分布要求高;

斐波那契查找适用于存储访问成本高的情况,比如磁盘存储。

相关文章:

  • 金桔网桥连载5-详解
  • pikachu靶场实战记录
  • OrangePi 5B 内核开启 CONFIG_CIFS 通过 Samba 挂载 NAS 路径
  • 文件上传绕过的小点总结(3)
  • C++效率掌握之STL库:stack queue函数全解
  • C++ 利用类模板实现一个数组类封装
  • 《数字图像处理》第三章 3.7 混合空间增强法笔记:原理、实现与Python实战
  • 【赵渝强老师】达梦数据库的物理存储结构
  • 使用Langchain4J整合springboot+流式数据响应示例
  • # Ubuntu 软件包管理:apt、snap 和 Flatpak 如何选择
  • GitHub 上的 Khoj 项目:打造你的专属 AI 第二大脑
  • MySQL 的索引类型有哪些?应该怎么选择?
  • React - LineChart组件编写(用于查看每日流水图表)
  • AI日报 - 2025年3月25日
  • 外观模式 (Facade Pattern)
  • 单片机串口打印调试信息②
  • 数据不外传!通过内网穿透实现绿联NAS远程访问的安全配置方案
  • 基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行步骤
  • 第四天 开始Unity Shader的学习之旅之Unity中的基础光照
  • 专业级 AI 提示生成工具清单
  • 鸿蒙概念股强势上涨,鸿蒙电脑本月正式发布,生态链即将补全
  • 安顺市原副市长、市公安局原局长顾长华任贵州省民委副主任
  • 娱见 | 为了撕番而脱粉,内娱粉丝为何如此在乎番位
  • 1101名优秀运动员拟保送,全红婵、黄雨婷、盛李豪在列
  • 什么让翻拍“语文”成为短视频新风潮
  • “彩虹滑道”项目两男童相撞飞跌出去,景区:工作人员误判导致