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

ops/2024/9/22 23:02:13/

插值查找(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实现:

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 源码

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 源码

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 源码

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.ppmy.cn/ops/3136.html

相关文章

鸿蒙OpenHarmony【搭建Ubuntu环境】

搭建Ubuntu环境 在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3861、Hi3516…

英语日常用语柯桥职场英语学习去哪里?专业语言培训推荐泓畅学校

“摸鱼”的英语表达 职场&#xff0c;总有些看似努力工作的同事&#xff0c;很可能是深藏不漏的“摸鱼圣手”。 但“摸鱼”的英文表达绝对不是“touch fish”这么简单&#xff01;上班摸鱼&#xff0c;就是不好好干活、浪费时间&#xff0c;所以“loaf”这个单词有必要了解一下…

鸿蒙原生应用元服务-访问控制(权限)开发场景与权限声明

一、场景介绍 应用的APL&#xff08;Ability Privilege Level&#xff09;等级分为normal、system_basic和system_core三个等级&#xff0c;默认情况下&#xff0c;应用的APL等级都为normal等级。权限类型分为system_grant和user_grant两种类型。 二、配置文件权限声明 应用需要…

功能强大的开源数据中台系统 DataCap 2024.03.3 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…

安卓接收后台数据转模型int默认为double

问题&#xff1a;后台登录接口返回userid&#xff08;int整型10000&#xff09;&#xff0c;app前端&#xff08;使用okgo&#xff09;拿到userid&#xff08;double类型10000.0&#xff09;&#xff1b;导致app前端进行接下来操作如App中a用户使用userid转字符串后“10000.0”…

Type-C保温杯/小家电sink取电方案,支持PD/QC/AFC多协议

Type-C接口如今已广泛应用于各种电子产品&#xff0c;从手机、电脑到音箱、耳机&#xff0c;几乎无处不在。这一接口的普及&#xff0c;极大地简化了充电和数据传输的过程&#xff0c;使我们的生活变得更加便捷。最近&#xff0c;市场上又出现了一款令人瞩目的新产品——Type-C…

Android 13 WRITE_EXTERNAL_STORAGE , READ_EXTERNAL_STORAGE不弹出的问题

解决Android 13 WRITE_EXTERNAL_STORAGE &#xff0c; READ_EXTERNAL_STORAGE不弹出的问题 在Android 13&#xff08;API 33&#xff09;之前&#xff0c;加入了如下代码 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/> <u…

element-ui form表单自定义label的样式、内容

element-ui form表单自定义label的样式、内容 效果截图 代码 <el-form size"small" :inline"true" label-width"120px"><el-form-item prop"name"><div slot"label"><i style"color: red;"…