Java插值查找知识点(含面试大厂题和源码)

插值查找(Interpolation Search)是一种在有序数组中查找特定元素的搜索算法。它是基于二分查找(Binary Search)的改进版本,特别适合当数据分布均匀时使用。插值查找的关键思想是利用数据的分布特性,预测要查找元素的可能位置,从而减少搜索的比较次数。

插值查找的工作原理:

  1. 估算位置:根据要查找的元素 key 和数组的当前范围(由 lowhigh 指定),估算 key 可能的位置 pos。计算公式通常是 pos = low + ((key - arr[low]) * (high - low)) / (arr[high] - arr[low])

  2. 比较与调整:将 arr[pos]key 进行比较:

    • 如果 arr[pos] 等于 key,则查找成功,返回 pos
    • 如果 arr[pos] 大于 key,则在 pos 之前的范围中查找(即调整 highpos - 1)。
    • 如果 arr[pos] 小于 key,则在 pos 之后的范围中查找(即调整 lowpos + 1)。
  3. 重复过程:继续以上步骤,直到找到 key 或者搜索范围无效(low 大于 high)。

插值查找的Java实现:

public class InterpolationSearch {
    public int interpolationSearch(int[] arr, int key) {
        int low = 0;
        int high = arr.length - 1;
        
        while (low <= high && key >= arr[low] && key <= arr[high]) {
            if (low == high) {
                if (arr[low] == key) return low;
                return -1;
            }
            
            int pos = low + ((key - arr[low]) * (high - low)) / (arr[high] - arr[low]);
            
            if (arr[pos] == key) {
                return pos;
            } else if (arr[pos] < key) {
                low = pos + 1;
            } else {
                high = pos - 1;
            }
        }
        
        return -1; // Element not found
    }
    
    public static void main(String[] args) {
        InterpolationSearch search = new InterpolationSearch();
        int[] arr = {10, 12, 13, 16, 18, 19, 20, 21, 22, 23, 24, 33, 35, 42, 47};
        int key = 18;
        int index = search.interpolationSearch(arr, key);
        System.out.println("Index of " + key + " is: " + index);
    }
}

插值查找的适用场景:

  • 当数据集较大且数据分布均匀时,插值查找的性能通常比二分查找更好。
  • 插值查找不适合数据分布不均匀的情况,因为它依赖于数据的均匀分布。

面试中的插值查找:

在面试中,面试官可能会询问关于插值查找的问题,以评估应聘者对搜索算法的理解和适用场景的把握。通过实现插值查找,可以展示你对算法性能优化的理解和应用能力。

希望这些知识点和示例代码能够帮助你更好地准备面试!插值查找是一种高效的搜索算法,特别适合于数据分布均匀的场景。以下是三道与插值查找相关的面试题目,以及相应的Java源码实现。

题目 1:有序数组中的查找

描述
给定一个有序数组,编写一个方法来查找一个目标值,如果存在,则返回其索引;如果不存在,则返回-1。

示例

输入: nums = [10, 12, 14, 16, 18, 19, 20], target = 14
输出: 2

Java 源码

public class SearchInSortedArray {
    public int search(int[] nums, int target) {
        int low = 0, high = nums.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        SearchInSortedArray solution = new SearchInSortedArray();
        int[] nums = {10, 12, 14, 16, 18, 19, 20};
        int target = 14;
        int result = solution.search(nums, target);
        System.out.println("Index of target: " + result);
    }
}

题目 2:旋转排序数组中的查找

描述
给定一个旋转排序的数组,编写一个方法来查找一个目标值,如果存在,则返回其索引。

示例

输入: nums = [4, 5, 6, 7, 0, 1, 2], target = 0
输出: 4

Java 源码

public class SearchInRotatedSortedArray {
    public int search(int[] nums, int target) {
        int low = 0, high = nums.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            // 判断左右半区是否有序
            if (nums[low] <= nums[mid]) {
                if (target >= nums[low] && target < nums[mid]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            } else {
                if (target > nums[mid] && target <= nums[high]) {
                    low = mid + 1;
                } else {
                    high = mid - 1;
                }
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        SearchInRotatedSortedArray solution = new SearchInRotatedSortedArray();
        int[] nums = {4, 5, 6, 7, 0, 1, 2};
        int target = 0;
        int result = solution.search(nums, target);
        System.out.println("Index of target: " + result);
    }
}

题目 3:有序数组中的最小绝对差

描述
给定一个有序数组,找到任意两个元素之间的最小绝对差。

示例

输入: nums = [3, 8]
输出: 5

Java 源码

public class MinimumAbsoluteDifference {
    public int minDifference(int[] nums) {
        if (nums == null || nums.length < 2) {
            return 0;
        }
        int minDiff = nums[1] - nums[0];
        for (int i = 1; i < nums.length - 1; i++) {
            minDiff = Math.min(minDiff, nums[i + 1] - nums[i]);
        }
        return minDiff;
    }

    public static void main(String[] args) {
        MinimumAbsoluteDifference solution = new MinimumAbsoluteDifference();
        int[] nums = {3, 8};
        int result = solution.minDifference(nums);
        System.out.println("Minimum absolute difference: " + result);
    }
}

这些题目和源码展示了插值查找在解决实际问题中的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s 部署 kube-prometheus监控

一、Prometheus监控部署 1、下载部署文件 # 使用此链接下载后解压即可 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/release-0.13.zip2、根据k8s集群版本获取不同的kube-prometheus版本部署 https://github.com/prometheus-operator/k…

达梦数据库一体机树立金融解决方案标杆

达梦数据库一体机自问世以来&#xff0c;获得众多行业用户的高度关注&#xff0c;并率先在金融行业吹响冲锋号角&#xff0c;实现多个重大项目的落地应用。近日&#xff0c;珠海华润银行股份有限公司基于达梦数据库一体机 I 系列的《数据库一体机银行多业务系统集中部署解决方案…

STM32之串口中断接收丢失数据

五六年没搞STM32了&#xff0c;这个项目一切都挺顺利&#xff0c;万万没想到被串口接收中断恶心到了。遇到的问题很奇怪 HAL_UART_Receive_IT(&huart1, &rx_buffer[rx_index], LCD_UART_LEN); 这个代码中 LCD_UART_LEN1的时候&#xff0c;接收过来的数据&#xff0c;数…

VR全景展览——开启全新视界的虚拟展览体验

随着VR技术的不断发展和成熟&#xff0c;VR全景展览已经成为现代展览行业的一大亮点。通过模拟现实世界的场景&#xff0c;VR全景展览为用户提供了一个沉浸式的观展体验&#xff0c;使参观者能够跨越地理和时间限制&#xff0c;探索不同领域的展览。 一、VR全景展览的功能优势 …

用RPA自动给抖音涨粉(内附使用教程)

前言 小北准备新开一个教程系列&#xff0c;关于如何用RPA自动化给抖音涨粉。 因为我最近在摸索抖音相关的玩法&#xff0c; 发现抖音很多功能都需要一定的粉丝基础才能开通&#xff0c;比如达人&#xff0c;星图&#xff0c;带货等等。 所以有没有什么办法可以自动涨粉&am…

AI时代,我要如何学习,才能跟上步伐

在21世纪这个被数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。无论是智能手机中的语音助手、在线客服的聊天机器人&#xff0c;还是自动驾驶汽车&#xff0c;AI的应用都在告诉我们一个信息&#xff1a;未来已来。因此&#xff0…

Java的Hash算法及相应的Hmac算法

【相关知识】 加密算法知识相关博文&#xff1a;浅述.Net中的Hash算法&#xff08;顺带对称、非对称算法&#xff09;-CSDN博客 【出处与参考】 MessageDigest 类介绍、分多次调用update方法与一次性调用一致的说明引自&#xff1a; https://blog.csdn.net/cherry_chenr…

【系统分析师】系统配置与性能评价

文章目录 1、性能指标2、阿姆达尔解决方案3、性能评价方法 1、性能指标 例题 2、阿姆达尔解决方案 大概了解 例题 3、性能评价方法

122.Mit.S081操作系统内核(实验环境搭建)

目录 一、前言 二、实验官网 三、可参考内容 四、qemu介绍 五、环境搭建 1.Linux系统 ubuntu 脚本安装 检测是否安装成功 2.SSH连接工具 3.获取代码 六、搭建成功实例 1.源码目录简析 2.启动xv6 3.远程连接成功示例 一、前言 Mit6.s081 是麻省理工学院面向本…

Antd:在文本框中展示格式化JSON

要想将对象转换为格式化 JSON 展示在文本框中&#xff0c;需要用到 JSON.stringify JSON.stringify 方法接受三个参数&#xff1a; value&#xff1a;必需&#xff0c;一个 JavaScript 值&#xff08;通常为对象或数组&#xff09;要转换为 JSON 字符串。replacer&#xff1a…

商务品牌解决方案企业网站模板 Bootstrap5

目录 一.前言 二.展示 三.下载链接 一.前言 这个网站包含以下内容&#xff1a; 导航栏&#xff1a;主页&#xff08;Home&#xff09;、关于&#xff08;About&#xff09;、服务&#xff08;Services&#xff09;、博客&#xff08;Blog&#xff09;等页面链接。主页部分…

Adipogen—Progranulin (human) ELISA Kit (mAb/mAb)

前颗粒蛋白&#xff08;Progranulin&#xff0c;PGRN&#xff09;是一种富含半胱氨酸的蛋白质&#xff0c;由~ 6kDa大小的颗粒蛋白&#xff08;granulin&#xff0c;GRN&#xff09;组成&#xff0c;具有多功能生物活性&#xff0c;在癌症、炎症、代谢性疾病和神经退行性疾病中…

2024洗地机名牌排行榜:细数最值得买的4大热门款

随着科技的迅速发展&#xff0c;人们的家里纷纷都添置了新的清洁工具——洗地机&#xff0c;它集合了吸、拖、洗于一体&#xff0c;减轻了很多家庭家务的负担&#xff0c;也成为了很多家庭改善清洁体验的新选择。那么市场上的洗地机品牌琳琅满目&#xff0c;我们要如何挑选一款…

教你三招,玩转AI通用大模型ChatGPT

工欲善其事必先利其器&#xff0c;想要高效的用好ChatGPT&#xff0c;首先&#xff0c;让我们从如何与它进行有效的对话开始。要知道&#xff0c;ChatGPT并非简单的问答机器&#xff0c;而是一个可以通过交互学习和适应的智能体。那么&#xff0c;如何让ChatGPT来更好地理解我们…

ruoyi创建子模块

点击项目 -> new -> Module 选择maven模式 构建完成 子项目默认会加入到父项目maven控制在 父项目 pom文件中 dependencyManagement 标签内加入一下代码 新建子模块的名称<!-- 测试--><dependency><groupId>com.safety</groupId><artifact…

vscode+vue开发常用插件整理

前言&#xff1a; vscode新机开发常用插件整理 1、chinese 简体中文配置 2、file-jump 别名跳转&#xff0c;可以把引入的组件&#xff0c;通过ctrl地址名 跳转组件内部 3、Vue Peek&#xff1a;vue项目中的一些配置&#xff0c;安装后&#xff0c;能实现 ctrl组件名 跳转…

JavaEE进阶:基础知识

JavaEE&#xff1a;Java企业开发 Web网站的工作流程 ⽬前用户对PC端应⽤的开发结构模式主要分为C/S和B/S结构. CS即Client/Server&#xff08;客户机/服务器&#xff09;结构. 常⻅的C/S架构的应⽤⽐如QQ&#xff0c;CCTALK&#xff0c;各种⽹络游戏 等等&#xff0c;⼀般需…

【创建型模式】工厂方法模式

一、简单工厂模式 1.1 简单工厂模式概述 简单工厂模式又叫做静态工厂方法模式。 目的&#xff1a;定义一个用于创建对象的接口。实质&#xff1a;由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 简单工厂模式…

MYSQL之增删改查(上)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 1、“增”——添加数据 1.1…

【简单介绍下R-Tree】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…
最新文章