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

news/2024/11/28 1:39:58/

插值查找(Interpolation Search)是一种改进的二分查找算法,它适用于数据分布均匀的有序数组。插值查找的基本思想是,根据要查找的关键字与数组的最大值和最小值之间的比例,预测关键字可能存在的位置,从而跳过一些不可能包含关键字的区间,以此来减少查找所需的比较次数。

插值查找的工作原理:

  1. 确定查找范围:首先确定待查找关键字的上下界,即数组的起始位置和结束位置。
  2. 计算插值位置:根据当前的上下界,使用插值公式计算出一个预测位置 pos
    pos = low + ((key - arr[low]) * (high - low)) / (arr[high] - arr[low])
    
    其中 key 是要查找的关键字,arr 是有序数组,lowhigh 分别是当前查找区间的下界和上界。
  3. 比较并调整:将数组中的 pos 位置的值与关键字进行比较。
    • 如果 arr[pos] == key,则查找成功。
    • 如果 arr[pos] < key,则新的查找区间的下界 low 更新为 pos + 1
    • 如果 arr[pos] > key,则新的查找区间的上界 high 更新为 pos - 1
  4. 重复步骤 2 和 3:直到找到关键字或者查找范围无效(即 low > high)。

插值查找的优缺点:

优点

  • 对于均匀分布的数据,插值查找的平均查找效率可以达到 O(log log n)。
  • 插值查找可以快速跳过不可能包含关键字的区间,减少比较次数。

缺点

  • 插值查找的性能依赖于数据的分布情况,对于非均匀分布的数据,其性能可能下降到 O(n)。
  • 插值查找需要对数据进行额外的处理(如计算插值位置),这可能增加算法的复杂性。

插值查找的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 + Math.round(((double) (high - low) / (arr[high] - arr[low])) * (key - arr[low]));if (arr[pos] == key) {return pos;} else if (arr[pos] < key) {low = pos + 1;} else {high = pos - 1;}}return -1; // 如果没有找到,返回-1}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:有序数组中的查找

描述
给定一个有序整数数组,写一个方法来查找一个目标值是否存在于数组中。

示例

输入: nums = [4, 5, 6, 7, 7, 8, 8], target = 6
输出: true

Java 源码

public class SearchInSortedArray {public boolean search(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return true;}if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return false;}public static void main(String[] args) {SearchInSortedArray solution = new SearchInSortedArray();int[] nums = {4, 5, 6, 7, 7, 8, 8};int target = 6;boolean result = solution.search(nums, target);System.out.println("Target " + target + " found: " + result);}
}

题目 2:有序矩阵中的查找

描述
给定一个 m x n 的有序整数矩阵(每行从左向右递增,每列从上到下递增),请写出一个方法来查找目标值是否存在于矩阵中。

示例

输入:
matrix = [[1,   4,  7, 11, 15],[2,   5,  8, 12, 19],[3,   6,  9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]
target = 5
输出: true

Java 源码

public class SearchInSortedMatrix {public boolean searchMatrix(int[][] matrix, int target) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return false;}int m = matrix.length, n = matrix[0].length;int left = 0, right = m * n - 1;while (left <= right) {int mid = left + (right - left) / 2;int midValue = matrix[mid / n][mid % n];if (target == midValue) {return true;}if (target < midValue) {right = mid - 1;} else {left = mid + 1;}}return false;}public static void main(String[] args) {SearchInSortedMatrix solution = new SearchInSortedMatrix();int[][] matrix = {{1, 4, 7, 11, 15},{2, 5, 8, 12, 19},{3, 6, 9, 16, 22},{10, 13, 14, 17, 24},{18, 21, 23, 26, 30}};int target = 5;boolean result = solution.searchMatrix(matrix, target);System.out.println("Target " + target + " found in matrix: " + result);}
}

题目 3:找出有序数组中缺失的数字

描述
给定一个有序整数数组,其中有些数字是重复的,有些数字可能缺失,找出并返回缺失的最小正整数。

示例

输入: [2, 3, 4, 6, 7, 9, 12]
输出: 5

Java 源码

public class FindMissingNumber {public int findMissing(int[] nums) {int n = nums.length;int sum = (n + 1) * n / 2; // 计算理想情况下的和int actualSum = 0;for (int num : nums) {actualSum += num;}return sum - actualSum;}public static void main(String[] args) {FindMissingNumber solution = new FindMissingNumber();int[] nums = {2, 3, 4, 6, 7, 9, 12};int missingNumber = solution.findMissing(nums);System.out.println("Missing number: " + missingNumber);}
}

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


http://www.ppmy.cn/news/1418614.html

相关文章

VLC播放YUV视频文件

1.安装VLC并添加到环境变量 2.打开终端输入下列命令并执行: vlc --demux rawvideo --rawvid-fps 15 --rawvid-width 480 --rawvid-height 272 --rawvid-chroma I420 ./bigbuckbunny_480x272.yuv 3.播放效果: 4.

共享IP和独享IP如何选择,两者有何区别?

有跨境用户在选择共享IP和独享IP时会有疑问&#xff0c;不知道该如何进行选择&#xff0c;共享IP和独享IP各有其特点和应用场景&#xff0c;选择哪种方式主要取决于具体需求和预算。以下是对两者的详细比较&#xff1a; 首先两者的主要区别在于使用方式和安全性&#xff1a;共…

VirtualBox - 与 Win10 虚拟机 与 宿主机 共享文件

原文链接 https://www.cnblogs.com/xy14/p/10427353.html 1. 概述 需要在 宿主机 和 虚拟机 之间交换文件复制粘贴 貌似不太好使 2. 问题 设置了共享文件夹之后, 找不到目录 3. 环境 宿主机 OS Win10开启了 网络发现 略虚拟机 OS Win10开启了 网络发现 略Virtualbox 6 4…

HTTP 域名和主机是一回事吗?有了主机和域名,如何建站?

域名不等于主机名&#xff0c;例如baidu.com是一个权威域的域名&#xff0c;但是根本没有一个主机的名字叫做baidu.com,但是dns.baidu.com就是一个主机名&#xff0c;它就是负责baidu.com的服务器的主机名&#xff0c;www.baidu.com也是一个主机名,它是百度web服务器的主机名。…

ubuntu系统安装python虚拟环境

一、安装python&#xff1a; 步骤1&#xff1a;在Ubuntu系统中打开终端&#xff0c;你可以使用快捷键CtrlAltT来打开终端&#xff0c;或者在应用程序菜单中找到终端。 步骤2&#xff1a;更新软件包列表&#xff0c;在终端中输入以下命令&#xff0c;更新软件包列表&#xff1…

ping命令返回无法访问目标主机和请求超时浅析

在日常经常用ping命令测试网络是否通信正常&#xff0c;使用ping命令时也经常会遇到这两种情况&#xff0c;那么表示网络出现了问题。 1、请求超时的原因 可以看到“请求超时”没有收到任何回复。要知道&#xff0c;IP数据报是有生存时间的&#xff0c;当其生存时间为零时就会…

解析ShardingSphere:强大的分布式数据库中间件

在现代软件开发中&#xff0c;随着数据量的爆炸性增长和系统复杂度的持续上升&#xff0c;传统的单体数据库架构已经难以应对日益增长的性能与扩展性需求。针对这一挑战&#xff0c;ShardingSphere应运而生&#xff0c;它提供了一套全面的解决方案&#xff0c;帮助开发者构建更…

001vscode为什么设置不了中文?

VSCode中文插件安装 在VSCode中设置中文的首要步骤是安装“Chinese (Simplified) Language Pack for Visual Studio Code”扩展插件。这一过程十分简单&#xff0c;只需打开VSCode&#xff0c;进入扩展市场&#xff0c;搜索“ Chinese (Simplified) Language Pack ”然后点击…