首页 > 编程语言 >Java插值查找知识点(含面试大厂题和源码)

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

时间:2024-03-31 10:01:37浏览次数:27  
标签:知识点 arr Java int 查找 插值 源码 low key

插值查找(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);
    }
}

在面试中,了解插值查找的原理和实现是非常重要的,尤其是当面试官询问如何处理有序数据集的查找问题时。插值查找是二分查找的一种变体,适用于数据分布均匀的场景,但在数据分布不均匀的情况下,其性能可能不如二分查找。

题目 1:有序数组中的众数

描述
给定一个大小为 n 的有序数组,找到数组中的众数。众数是指在数组中出现次数超过 ⌊ n/2 ⌋ 的元素。

示例

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

Java 源码

public class MajorityElement {
    public int majorityElement(int[] nums) {
        int candidate = nums[0], count = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == candidate) {
                count++;
            } else if (count == 1) {
                candidate = nums[i];
                count = 1;
            } else {
                count--;
            }
        }
        // 验证众数
        int majorityCount = 0;
        for (int num : nums) {
            if (num == candidate) {
                majorityCount++;
            }
        }
        return (majorityCount > nums.length / 2) ? candidate : -1;
    }

    public static void main(String[] args) {
        MajorityElement solution = new MajorityElement();
        int[] nums = {2, 3, 3, 4, 4, 4, 6, 6, 7, 8, 9};
        int result = solution.majorityElement(nums);
        System.out.println("The majority element is: " + result);
    }
}

题目 2:有序数组中的第 K 个缺失的正数

描述
给定一个有序数组,其中包含了从 1 到 n 的部分整数,找出数组中第 k 个缺失的正数。

示例

输入: [2, 3, 4, 7, 9], k = 4
输出: 6

Java 源码

public class KthMissingPositive {
    public int findKthPositive(int[] arr, int k) {
        int n = arr.length;
        int maxElement = 0;
        for (int num : arr) {
            if (num > maxElement) {
                maxElement = num;
            }
        }
        // 计算缺失的正数数量
        int missingCount = maxElement - 1 - n;
        // 如果 k 小于缺失的数量,直接返回 k + 1
        if (k <= missingCount) {
            return k + 1;
        }
        // 否则,找到第一个大于 (k - missingCount - 1) 的元素
        for (int i = 0; i < n; i++) {
            if (arr[i] > (k - missingCount - 1)) {
                return (k - missingCount - 1) + (k - i);
            }
        }
        return (k - missingCount - 1) + n;
    }

    public static void main(String[] args) {
        KthMissingPositive solution = new KthMissingPositive();
        int[] arr = {2, 3, 4, 7, 9};
        int k = 4;
        int result = solution.findKthPositive(arr, k);
        System.out.println("The kth missing positive number is: " + result);
    }
}

题目 3:有序数组中的两个和为特定值的元素

描述
给定一个有序整数数组,找到两个数,使得它们的和等于特定值。如果存在这样的两个数,返回它们的数组索引,否则返回 [-1, -1]。

示例

输入: [2, 3, 4, 6, 7, 9, 11], target = 11
输出: [1, 5]

Java 源码

public class TwoSumII {
    public int[] twoSumII(int[] numbers, int target) {
        int left = 0, right = numbers.length - 1;
        while (left < right) {
            int sum = numbers[left] + numbers[right];
            if (sum == target) {
                return new int[]{left + 1, right + 1};
            } else if (sum < target) {
                left++;
            } else {
                right--;
            }
        }
        return new int[]{-1, -1};
    }

    public static void main(String[] args) {
        TwoSumII solution = new TwoSumII();
        int[] numbers = {2, 3, 4, 6, 7, 9, 11};
        int target = 11;
        int[] result = solution.twoSumII(numbers, target);
        System.out.println("The indices of the two numbers are: [" + result[0] + ", " + result[1] + "]");
    }
}

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

标签:知识点,arr,Java,int,查找,插值,源码,low,key
From: https://blog.csdn.net/2302_80314137/article/details/137193165

相关文章

  • Java顺序查找知识点(含面试大厂题和源码)
    顺序查找(SequentialSearch),也称为线性查找,是一种简单直观的查找算法。它通过逐个检查数据集中的每个元素来查找目标值。顺序查找不要求数据集是有序的,因此它适用于任何形式的数据集,包括数组、链表、列表等。顺序查找的工作原理:开始查找:从数据集的起始位置开始。逐个比较:将......
  • java毕业设计青少年视力筛查系统(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着科技的发展和生活节奏的加快,青少年的视力健康问题日益凸显。长时间使用电子产品、不合理的阅读习惯以及缺乏户外活动等因素导致青少年近视......
  • Java常用新特性之Stream API
    一,认识Stream1.StreamAPIvs集合框架StreamAPI之于集合就类似于SQL之于数据表。集合:存储数据,基于内存的。StreamAPI:处理数据,基于CPU的3.使用说明①Stream自己不会存储元素。②Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream。③Stream......
  • java毕业设计上门医疗服务小程序(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着社会的发展和人口老龄化的加剧,人们对医疗服务的需求日益增长,特别是对于便捷、高效的上门医疗服务。传统的医疗服务模式要求患者亲自前往医院或诊所就......
  • java毕业设计汽车租赁系统(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着共享经济的兴起和汽车产业的发展,汽车租赁作为一种新兴的出行方式逐渐受到人们的欢迎。传统的汽车租赁业务多依赖于线下门店操作,顾客需要到店选车、签......
  • java毕业设计天勤人力资源管理(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义一、选题背景:在当今竞争激烈的商业环境中,人力资源管理(HRM)对于组织的成功至关重要。有效的HRM不仅能够提高员工的工作效率和满意度,而且可以促进企业的整体发展战......
  • java毕业设计数字家谱管理系统(Springboot+mysql+jdk1.8+maven3.39)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义一、选题背景:在快速变化的社会中,人们越来越意识到家族历史和文化传承的重要性。家谱作为记录家族血脉和历史的重要文献,承载着丰富的文化价值和历史信息。然而,传统......
  • 《手把手教你》系列技巧篇(六十二)-java+ selenium自动化测试-RemoteWebDriver让你的代
    1.简介当本机上没有浏览器,需要远程调用浏览器进行自动化测试时,需要用到RemoteWebDirver。宏哥申请服务器还没有下来,也懒得自己在本地安装虚拟机,等的时间太长了于是就网上找了一个可以免费试用2天的服务器(网址:DedicatedServerHostingService|BareMetal|Varidata),注册一......
  • 《手把手教你》系列技巧篇(六十一)-java+ selenium自动化测试 - 截图三剑客 -下篇(详细教
    1.简介按照计划宏哥今天将介绍java+selenium自动化测试截图操作实现的第三种截图方法,也就是截图的第三剑客-截取某个元素(或者目标区域)的图片。在测试的过程中,有时候不需要截取整个屏幕,只需要截取某个元素(或者目标区域)的图片,今天宏哥就来讲解和分享这些内容。2. 截取某个......
  • Uniswap V2源码解读
    Uniswap是一个开源的去中心化的交易所,在github上面有以下重要仓库:uniswap-v2-core:币对池pair的核心智能合约。这个repository包含了Uniswap的币对池pair的所有核心逻辑,增加流动性、减少流动性等。uniswap-v2-periphery:这个repository包含了UniswapV3的所有周边智能合约。这些......