IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 查找算法-插值查找 -> 正文阅读

[数据结构与算法]查找算法-插值查找

插值查找原理:

  • 插值查找算法类似于二分查找, 不同的是插值查找每次从自适应 mid 处开始查找
  • 改变二分查找的区间缩减策略,根据搜索的值来确定区间缩减幅度,使其不再是固定的1/2,这种想法就是“插值查找”
  • 如果目标值key和左边界值a[low]差的多,则中间位置mid更靠右;如果目标值key和左边界值差的少,则中间位置mid更靠左。也就是说,插值查找算法的中间位置mid不是真的在中间了,而是根据目标值和边界值的关系动态的确定
    在这里插入图片描述
public class InsertValueSearch {
    public static void main(String[] args) {
        //原始列表,有序且关键字分布均匀
        int[] arr = new int[100];
        for (int i = 0; i < arr.length ; i++) {
            arr[i] = i + 1;
        }
        int target = 26;
        int index = InsertValueSearch(arr, 0, arr.length - 1, target);
        System.out.println(index);  //99
    }

    /**
     * 插值查找算法
     * 注意:插值查找算法也要求列表必须是有序的!!!
     * @param arr    原始列表
     * @param left   每次参与查找的列表的起始元素的下标
     * @param right  每次参与查找的列表的终止元素的下标
     * @param target 最终要查找的目标元素
     * @return 要查找的目标元素在列表中的位置;如果没有找到,则返回-1;
     */
    private static int InsertValueSearch(int[] arr, int left, int right, int target) {
        //如果列表中所有的元素都不匹配,返回-1
        //如果要查找的目标元素大于列表中值最大的元素(即最后一个元素)或者小于值最小的元素(即第一个元素),那么目标元素肯定不存在列表中,直接结束查找;
        //注意:"|| target < arr[0] || target > arr[arr.length - 1]"这段代码是必须要有的,如果没有的话可能会导致后面的mid越界!!!
        if (left > right || target < arr[0] || target > arr[arr.length - 1]) {
            System.out.println("抱歉,列表中并不存在元素:" + target);
            return -1;
        }

        //获取查找点mid,自适应
        //int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;
        int mid = left + (right - left) * (target - arr[left]) / (arr[right] - arr[left]);
        if (target > arr[mid]) {
            //如果要查找的目标元素大于查找点位置的元素,使用递归对查找点右侧的所有元素进行相同方式的查找
            return InsertValueSearch(arr,  mid + 1, right,target);
        } else if (target < arr[mid]) {
            //如果要查找的目标元素小于查找点位置的元素,使用递归对查找点左侧的所有元素进行相同方式的查找
            return InsertValueSearch(arr,  left, mid - 1,target);
        } else {
            //要查找的目标元素正好就是查找点位置的元素,返回查找点
            return mid;
        }
    }
}




  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:25:52  更:2022-03-17 22:29:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:28:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码