[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-erfenchazhaodeliangzhonghexinleixingjingzhunchazhaoyujinsichazhaojavashixianyuchangjingfenxi":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":15,"allowComments":15,"password":13,"viewCount":16,"likeCount":15,"commentCount":15,"seoTitle":5,"seoKeywords":17,"seoDescription":18,"source":13,"sourceUrl":13,"publishTime":19},"2008065130120671233","二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析）","erfenchazhaodeliangzhonghexinleixingjingzhunchazhaoyujinsichazhaojavashixianyuchangjingfenxi","# 二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析） ## 前言 二分查找（Binary Search）作为有序数组的高效查找算法，其时间复杂度为O(log n)，远优于线性查找的O(n)。根据查找需求的不同，二分查找可分为两大核心类型：**精准查找**与**近似查找**。精准查找是二分查找的原始形态，专注于判断目标值是否存在并返回其精确索引；近似查找则是精准查找的扩展，用于在目标值不存在时，找到与目标值最接近的元素，满足实际业务中的模糊匹配需求。本文将详细讲解这两种查找类型的原理、Java实现及适用场景。 ## 一、 精准查找（Exact Binary Search） ### 1.","# 二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析）\n\n## 前言\n\n二分查找（Binary Search）作为有序数组的高效查找算法，其时间复杂度为O(log n)，远优于线性查找的O(n)。根据查找需求的不同，二分查找可分为两大核心类型：**精准查找**与**近似查找**。精准查找是二分查找的原始形态，专注于判断目标值是否存在并返回其精确索引；近似查找则是精准查找的扩展，用于在目标值不存在时，找到与目标值最接近的元素，满足实际业务中的模糊匹配需求。本文将详细讲解这两种查找类型的原理、Java实现及适用场景。\n\n## 一、 精准查找（Exact Binary Search）\n\n### 1.  核心定义与原理\n\n精准查找是二分查找的基础形态，其**核心目标是在有序数组中精准匹配目标值**：若目标值存在，返回其在数组中的索引；若目标值不存在，返回一个约定的无效标识（通常为-1，因数组索引非负，-1可明确表示“未找到”）。\n\n其实现原理基于分治思想，通过不断折半缩小查找区间实现高效查找，核心步骤如下：\n\n1. 初始化查找区间的左边界`left=0`，右边界`right=数组长度-1`（闭区间`[left, right]`）；\n\n2. 计算安全中间索引`mid = left + (right - left) \u002F 2`（避免`left + right`整数溢出）；\n\n3. 比较中间元素`nums[mid]`与目标值`target`：\n\n    - 若`nums[mid] == target`：精准匹配成功，返回`mid`；\n\n    - 若`nums[mid] > target`：目标值在左半区间，调整右边界`right = mid - 1`；\n\n    - 若`nums[mid] \u003C target`：目标值在右半区间，调整左边界`left = mid + 1`；\n\n4. 重复步骤2-3，直到找到目标值或查找区间失效（`left > right`），区间失效时返回-1表示未找到。\n\n### 2.  Java代码实现（迭代+递归）\n\n#### （1）迭代实现（推荐，无栈溢出风险，空间复杂度O(1)）\n\n```Java\n\npublic class ExactBinarySearch {\n    \u002F**\n     * 迭代式精准二分查找\n     * @param nums 升序有序数组\n     * @param target 待精准匹配的目标值\n     * @return 目标值索引（未找到返回-1）\n     *\u002F\n    public static int exactBinarySearchIterative(int[] nums, int target) {\n        \u002F\u002F 边界校验：数组为空或长度为0，直接返回-1\n        if (nums == null || nums.length == 0) {\n            return -1;\n        }\n\n        int left = 0;\n        int right = nums.length - 1;\n\n        \u002F\u002F 区间有效时继续查找\n        while (left \u003C= right) {\n            \u002F\u002F 安全计算中间索引，避免整数溢出\n            int mid = left + (right - left) \u002F 2;\n\n            if (nums[mid] == target) {\n                return mid; \u002F\u002F 精准匹配，返回索引\n            } else if (nums[mid] > target) {\n                right = mid - 1; \u002F\u002F 目标在左半区间，调整右边界\n            } else {\n                left = mid + 1; \u002F\u002F 目标在右半区间，调整左边界\n            }\n        }\n\n        \u002F\u002F 区间失效，未找到目标值，返回-1\n        return -1;\n    }\n\n    \u002F\u002F 测试方法\n    public static void main(String[] args) {\n        int[] sortedNums = {1, 3, 5, 7, 9, 11, 13, 15};\n        int targetExist = 7; \u002F\u002F 存在的目标值\n        int targetNotExist = 8; \u002F\u002F 不存在的目标值\n\n        int index1 = exactBinarySearchIterative(sortedNums, targetExist);\n        int index2 = exactBinarySearchIterative(sortedNums, targetNotExist);\n\n        System.out.println(\"目标值 \" + targetExist + \" 的精准索引：\" + index1); \u002F\u002F 输出3\n        System.out.println(\"目标值 \" + targetNotExist + \" 的精准索引：\" + index2); \u002F\u002F 输出-1\n    }\n}\n```\n\n#### （2）递归实现（代码简洁，存在栈溢出风险，空间复杂度O(log n)）\n\n```Java\n\npublic class ExactBinarySearchRecursive {\n    \u002F**\n     * 递归式精准二分查找\n     * @param nums 升序有序数组\n     * @param target 待精准匹配的目标值\n     * @param left 查找区间左边界\n     * @param right 查找区间右边界\n     * @return 目标值索引（未找到返回-1）\n     *\u002F\n    public static int exactBinarySearchRecursive(int[] nums, int target, int left, int right) {\n        \u002F\u002F 递归终止条件：区间失效，返回-1\n        if (left > right) {\n            return -1;\n        }\n\n        int mid = left + (right - left) \u002F 2;\n\n        if (nums[mid] == target) {\n            return mid; \u002F\u002F 精准匹配，返回索引\n        } else if (nums[mid] > target) {\n            \u002F\u002F 递归查找左半区间\n            return exactBinarySearchRecursive(nums, target, left, mid - 1);\n        } else {\n            \u002F\u002F 递归查找右半区间\n            return exactBinarySearchRecursive(nums, target, mid + 1, right);\n        }\n    }\n\n    \u002F\u002F 测试方法\n    public static void main(String[] args) {\n        int[] sortedNums = {1, 3, 5, 7, 9, 11, 13, 15};\n        int targetExist = 13;\n        int targetNotExist = 6;\n\n        \u002F\u002F 初始调用传入完整区间边界\n        int index1 = exactBinarySearchRecursive(sortedNums, targetExist, 0, sortedNums.length - 1);\n        int index2 = exactBinarySearchRecursive(sortedNums, targetNotExist, 0, sortedNums.length - 1);\n\n        System.out.println(\"目标值 \" + targetExist + \" 的精准索引：\" + index1); \u002F\u002F 输出6\n        System.out.println(\"目标值 \" + targetNotExist + \" 的精准索引：\" + index2); \u002F\u002F 输出-1\n    }\n}\n```\n\n### 3.  适用场景\n\n精准查找适用于**需要明确判断目标值是否存在，且需获取其精确位置**的场景，常见示例：\n\n1. 数据字典查询：如根据用户ID（唯一有序）查询用户在数组中的索引，进而获取用户完整信息；\n\n2. 有序数组的存在性校验：如判断某个数字是否在有序的成绩数组中，快速筛选合格\u002F不合格人员；\n\n3. 数据库索引查询：底层基于二分查找的变种（B+树），实现主键的精准查询，快速定位数据行；\n\n4. 配置项查找：在有序的配置参数数组中，精准匹配目标配置项的key，获取对应value。\n\n## 二、 近似查找（Approximate Binary Search）\n\n### 1.  核心定义与原理\n\n近似查找是精准查找的扩展形态，其**核心目标是：当目标值不存在于有序数组中时，找到与目标值最接近的元素（最小差值对应的元素）；若目标值存在，则直接返回其索引（自身即为最接近的元素）**。\n\n其实现原理基于精准查找的框架，核心扩展点是**在查找过程中持续记录并更新“最接近元素的索引”**，具体步骤如下：\n\n1. 初始化左边界`left=0`、右边界`right=数组长度-1`，同时初始化`nearestIndex`（保存最接近元素索引，初始值可设为0）；\n\n2. 计算中间索引`mid = left + (right - left) \u002F 2`；\n\n3. 比较`nums[mid]`与`target`的差值绝对值，若当前`nums[mid]`比`nums[nearestIndex]`更接近`target`，则更新`nearestIndex = mid`；\n\n4. 按照精准查找的逻辑调整查找边界（寻找精准匹配值）：\n\n    - 若`nums[mid] == target`：直接返回`mid`（精准匹配，无需继续查找）；\n\n    - 若`nums[mid] > target`：调整`right = mid - 1`；\n\n    - 若`nums[mid] \u003C target`：调整`left = mid + 1`；\n\n5. 重复步骤2-4，直到查找区间失效（`left > right`）；\n\n6. 区间失效后，返回记录的`nearestIndex`（即最接近目标值的元素索引）。\n\n### 2.  Java代码实现（迭代优先，避免栈溢出）\n\n```Java\n\npublic class ApproximateBinarySearch {\n    \u002F**\n     * 迭代式近似二分查找（查找最接近目标值的元素索引）\n     * @param nums 升序有序数组\n     * @param target 待查找的目标值\n     * @return 最接近目标值的元素索引（数组为空返回-1）\n     *\u002F\n    public static int approximateBinarySearch(int[] nums, int target) {\n        \u002F\u002F 边界校验：数组为空或长度为0，返回-1\n        if (nums == null || nums.length == 0) {\n            return -1;\n        }\n\n        int left = 0;\n        int right = nums.length - 1;\n        int nearestIndex = 0; \u002F\u002F 初始化最接近元素索引\n\n        while (left \u003C= right) {\n            int mid = left + (right - left) \u002F 2;\n\n            \u002F\u002F 核心：更新最接近元素的索引\n            \u002F\u002F 比较当前mid对应元素与已有最接近元素的差值绝对值\n            if (Math.abs(nums[mid] - target) \u003C Math.abs(nums[nearestIndex] - target)) {\n                nearestIndex = mid;\n            }\n            \u002F\u002F 特殊情况：若两个元素与目标值差值相等，可选择保留左侧元素（或右侧，按需调整）\n            else if (Math.abs(nums[mid] - target) == Math.abs(nums[nearestIndex] - target)) {\n                \u002F\u002F 此处选择保留索引较小的元素（即左侧元素），可根据业务需求修改\n                nearestIndex = Math.min(nearestIndex, mid);\n            }\n\n            \u002F\u002F 精准匹配时，直接返回mid\n            if (nums[mid] == target) {\n                return mid;\n            } else if (nums[mid] > target) {\n                right = mid - 1;\n            } else {\n                left = mid + 1;\n            }\n        }\n\n        \u002F\u002F 区间失效，返回最接近元素的索引\n        return nearestIndex;\n    }\n\n    \u002F\u002F 测试方法\n    public static void main(String[] args) {\n        int[] sortedNums = {1, 3, 5, 7, 9, 11, 13, 15};\n        int targetNotExist = 8; \u002F\u002F 不存在的目标值，最接近7（索引3）和9（索引4）\n        int targetExist = 7; \u002F\u002F 存在的目标值\n        int targetEdge = 0; \u002F\u002F 小于数组所有元素，最接近1（索引0）\n        int targetEdge2 = 16; \u002F\u002F 大于数组所有元素，最接近15（索引7）\n\n        int index1 = approximateBinarySearch(sortedNums, targetNotExist);\n        int index2 = approximateBinarySearch(sortedNums, targetExist);\n        int index3 = approximateBinarySearch(sortedNums, targetEdge);\n        int index4 = approximateBinarySearch(sortedNums, targetEdge2);\n\n        System.out.println(\"与 \" + targetNotExist + \" 最接近的元素索引：\" + index1 + \"，对应元素：\" + sortedNums[index1]); \u002F\u002F 输出3，对应7\n        System.out.println(\"与 \" + targetExist + \" 最接近的元素索引：\" + index2 + \"，对应元素：\" + sortedNums[index2]); \u002F\u002F 输出3，对应7\n        System.out.println(\"与 \" + targetEdge + \" 最接近的元素索引：\" + index3 + \"，对应元素：\" + sortedNums[index3]); \u002F\u002F 输出0，对应1\n        System.out.println(\"与 \" + targetEdge2 + \" 最接近的元素索引：\" + index4 + \"，对应元素：\" + sortedNums[index4]); \u002F\u002F 输出7，对应15\n    }\n}\n```\n\n### 3.  适用场景\n\n近似查找适用于**无需精准匹配，仅需获取与目标值最接近的元素**的场景，常见示例：\n\n1. 价格匹配系统：如电商平台中，用户输入一个心理价格，快速找到最接近该价格的商品（无需价格完全一致）；\n\n2. 温度\u002F湿度等传感器数据：如在有序的历史传感器数据中，查找与当前监测值最接近的历史数据，用于趋势分析；\n\n3. 模糊查询补全：如通讯录按拼音首字母有序排列，用户输入错误拼音时，返回最接近的联系人；\n\n4. 阈值匹配：如在有序的评分区间数组中，用户分数未精准匹配任何阈值时，找到最接近的阈值，确定对应的等级（如考试分数61分，最接近60分及格线）；\n\n5. 地理坐标查找：在有序的经纬度数组中，查找与目标坐标最接近的地点，实现附近地点推荐的基础功能。\n\n## 三、 精准查找与近似查找核心对比\n\n|对比维度|精准查找|近似查找|\n|---|---|---|\n|核心目标|精准匹配目标值，返回索引|找到最接近目标值的元素索引|\n|未找到目标值时|返回约定标识（如-1）|返回最接近元素的有效索引|\n|核心扩展|无额外逻辑|记录并更新最接近元素索引|\n|时间复杂度|O(log n)|O(log n)|\n|空间复杂度（迭代）|O(1)|O(1)|\n|空间复杂度（递归）|O(log n)|O(log n)|\n|核心特性|存在性判断+精准定位|模糊匹配+邻近值获取|\n## 四、 总结\n\n1. 二分查找的两大核心类型（精准查找、近似查找）均基于分治思想，时间复杂度均为O(log n)，仅在功能目标和逻辑细节上存在差异；\n\n2. 精准查找是基础，适用于需要明确存在性判断和精准索引的场景，未找到目标值时返回-1，迭代实现更安全高效；\n\n3. 近似查找是精准查找的扩展，适用于模糊匹配场景，通过记录最接近元素索引，在目标值不存在时返回有效结果；\n\n4. 实际开发中，需根据业务需求选择：若需精准匹配（如ID查询），使用精准查找；若需邻近值匹配（如价格推荐），使用近似查找。","\u003Ch1 data-line=\"0\" id=\"二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析）\">二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析）\u003C\u002Fh1>\n\u003Ch2 data-line=\"2\" id=\"前言\">前言\u003C\u002Fh2>\n\u003Cp data-line=\"4\">二分查找（Binary Search）作为有序数组的高效查找算法，其时间复杂度为O(log n)，远优于线性查找的O(n)。根据查找需求的不同，二分查找可分为两大核心类型：\u003Cstrong>精准查找\u003C\u002Fstrong>与\u003Cstrong>近似查找\u003C\u002Fstrong>。精准查找是二分查找的原始形态，专注于判断目标值是否存在并返回其精确索引；近似查找则是精准查找的扩展，用于在目标值不存在时，找到与目标值最接近的元素，满足实际业务中的模糊匹配需求。本文将详细讲解这两种查找类型的原理、Java实现及适用场景。\u003C\u002Fp>\n\u003Ch2 data-line=\"6\" id=\"一、 精准查找（Exact Binary Search）\">一、 精准查找（Exact Binary Search）\u003C\u002Fh2>\n\u003Ch3 data-line=\"8\" id=\"1.  核心定义与原理\">1.  核心定义与原理\u003C\u002Fh3>\n\u003Cp data-line=\"10\">精准查找是二分查找的基础形态，其\u003Cstrong>核心目标是在有序数组中精准匹配目标值\u003C\u002Fstrong>：若目标值存在，返回其在数组中的索引；若目标值不存在，返回一个约定的无效标识（通常为-1，因数组索引非负，-1可明确表示“未找到”）。\u003C\u002Fp>\n\u003Cp data-line=\"12\">其实现原理基于分治思想，通过不断折半缩小查找区间实现高效查找，核心步骤如下：\u003C\u002Fp>\n\u003Col data-line=\"14\">\n\u003Cli data-line=\"14\">\n\u003Cp data-line=\"14\">初始化查找区间的左边界\u003Ccode>left=0\u003C\u002Fcode>，右边界\u003Ccode>right=数组长度-1\u003C\u002Fcode>（闭区间\u003Ccode>[left, right]\u003C\u002Fcode>）；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"16\">\n\u003Cp data-line=\"16\">计算安全中间索引\u003Ccode>mid = left + (right - left) \u002F 2\u003C\u002Fcode>（避免\u003Ccode>left + right\u003C\u002Fcode>整数溢出）；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"18\">\n\u003Cp data-line=\"18\">比较中间元素\u003Ccode>nums[mid]\u003C\u002Fcode>与目标值\u003Ccode>target\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cul data-line=\"20\">\n\u003Cli data-line=\"20\">\n\u003Cp data-line=\"20\">若\u003Ccode>nums[mid] == target\u003C\u002Fcode>：精准匹配成功，返回\u003Ccode>mid\u003C\u002Fcode>；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"22\">\n\u003Cp data-line=\"22\">若\u003Ccode>nums[mid] &gt; target\u003C\u002Fcode>：目标值在左半区间，调整右边界\u003Ccode>right = mid - 1\u003C\u002Fcode>；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"24\">\n\u003Cp data-line=\"24\">若\u003Ccode>nums[mid] &lt; target\u003C\u002Fcode>：目标值在右半区间，调整左边界\u003Ccode>left = mid + 1\u003C\u002Fcode>；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"26\">\n\u003Cp data-line=\"26\">重复步骤2-3，直到找到目标值或查找区间失效（\u003Ccode>left &gt; right\u003C\u002Fcode>），区间失效时返回-1表示未找到。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"28\" id=\"2.  Java代码实现（迭代+递归）\">2.  Java代码实现（迭代+递归）\u003C\u002Fh3>\n\u003Ch4 data-line=\"30\" id=\"（1）迭代实现（推荐，无栈溢出风险，空间复杂度O(1)）\">（1）迭代实现（推荐，无栈溢出风险，空间复杂度O(1)）\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"32\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">Java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-Java\" language=Java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ExactBinarySearch\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 迭代式精准二分查找\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> nums 升序有序数组\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> target 待精准匹配的目标值\n     * \u003Cspan class=\"hljs-doctag\">@return\u003C\u002Fspan> 目标值索引（未找到返回-1）\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">exactBinarySearchIterative\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] nums, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> target)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 边界校验：数组为空或长度为0，直接返回-1\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums == \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan> || nums.length == \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> -\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n        }\n\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">left\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">right\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> nums.length - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 区间有效时继续查找\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">while\u003C\u002Fspan> (left &lt;= right) {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 安全计算中间索引，避免整数溢出\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">mid\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> left + (right - left) \u002F \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>;\n\n            \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums[mid] == target) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> mid; \u003Cspan class=\"hljs-comment\">\u002F\u002F 精准匹配，返回索引\u003C\u002Fspan>\n            } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums[mid] &gt; target) {\n                right = mid - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 目标在左半区间，调整右边界\u003C\u002Fspan>\n            } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> {\n                left = mid + \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 目标在右半区间，调整左边界\u003C\u002Fspan>\n            }\n        }\n\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 区间失效，未找到目标值，返回-1\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> -\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n    }\n\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 测试方法\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] sortedNums = {\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">7\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">9\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">11\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">13\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">15\u003C\u002Fspan>};\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetExist\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">7\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 存在的目标值\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetNotExist\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">8\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 不存在的目标值\u003C\u002Fspan>\n\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index1\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> exactBinarySearchIterative(sortedNums, targetExist);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index2\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> exactBinarySearchIterative(sortedNums, targetNotExist);\n\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;目标值 &quot;\u003C\u002Fspan> + targetExist + \u003Cspan class=\"hljs-string\">&quot; 的精准索引：&quot;\u003C\u002Fspan> + index1); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出3\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;目标值 &quot;\u003C\u002Fspan> + targetNotExist + \u003Cspan class=\"hljs-string\">&quot; 的精准索引：&quot;\u003C\u002Fspan> + index2); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出-1\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"83\" id=\"（2）递归实现（代码简洁，存在栈溢出风险，空间复杂度O(log n)）\">（2）递归实现（代码简洁，存在栈溢出风险，空间复杂度O(log n)）\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"85\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">Java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-Java\" language=Java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ExactBinarySearchRecursive\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 递归式精准二分查找\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> nums 升序有序数组\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> target 待精准匹配的目标值\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> left 查找区间左边界\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> right 查找区间右边界\n     * \u003Cspan class=\"hljs-doctag\">@return\u003C\u002Fspan> 目标值索引（未找到返回-1）\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">exactBinarySearchRecursive\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] nums, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> target, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> left, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> right)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 递归终止条件：区间失效，返回-1\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (left &gt; right) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> -\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n        }\n\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">mid\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> left + (right - left) \u002F \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>;\n\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums[mid] == target) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> mid; \u003Cspan class=\"hljs-comment\">\u002F\u002F 精准匹配，返回索引\u003C\u002Fspan>\n        } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums[mid] &gt; target) {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 递归查找左半区间\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> exactBinarySearchRecursive(nums, target, left, mid - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> {\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 递归查找右半区间\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> exactBinarySearchRecursive(nums, target, mid + \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>, right);\n        }\n    }\n\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 测试方法\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] sortedNums = {\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">7\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">9\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">11\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">13\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">15\u003C\u002Fspan>};\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetExist\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">13\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetNotExist\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">6\u003C\u002Fspan>;\n\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 初始调用传入完整区间边界\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index1\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> exactBinarySearchRecursive(sortedNums, targetExist, \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>, sortedNums.length - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index2\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> exactBinarySearchRecursive(sortedNums, targetNotExist, \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>, sortedNums.length - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>);\n\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;目标值 &quot;\u003C\u002Fspan> + targetExist + \u003Cspan class=\"hljs-string\">&quot; 的精准索引：&quot;\u003C\u002Fspan> + index1); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出6\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;目标值 &quot;\u003C\u002Fspan> + targetNotExist + \u003Cspan class=\"hljs-string\">&quot; 的精准索引：&quot;\u003C\u002Fspan> + index2); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出-1\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"131\" id=\"3.  适用场景\">3.  适用场景\u003C\u002Fh3>\n\u003Cp data-line=\"133\">精准查找适用于\u003Cstrong>需要明确判断目标值是否存在，且需获取其精确位置\u003C\u002Fstrong>的场景，常见示例：\u003C\u002Fp>\n\u003Col data-line=\"135\">\n\u003Cli data-line=\"135\">\n\u003Cp data-line=\"135\">数据字典查询：如根据用户ID（唯一有序）查询用户在数组中的索引，进而获取用户完整信息；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"137\">\n\u003Cp data-line=\"137\">有序数组的存在性校验：如判断某个数字是否在有序的成绩数组中，快速筛选合格\u002F不合格人员；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"139\">\n\u003Cp data-line=\"139\">数据库索引查询：底层基于二分查找的变种（B+树），实现主键的精准查询，快速定位数据行；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"141\">\n\u003Cp data-line=\"141\">配置项查找：在有序的配置参数数组中，精准匹配目标配置项的key，获取对应value。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 data-line=\"143\" id=\"二、 近似查找（Approximate Binary Search）\">二、 近似查找（Approximate Binary Search）\u003C\u002Fh2>\n\u003Ch3 data-line=\"145\" id=\"1.  核心定义与原理\">1.  核心定义与原理\u003C\u002Fh3>\n\u003Cp data-line=\"147\">近似查找是精准查找的扩展形态，其\u003Cstrong>核心目标是：当目标值不存在于有序数组中时，找到与目标值最接近的元素（最小差值对应的元素）；若目标值存在，则直接返回其索引（自身即为最接近的元素）\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp data-line=\"149\">其实现原理基于精准查找的框架，核心扩展点是\u003Cstrong>在查找过程中持续记录并更新“最接近元素的索引”\u003C\u002Fstrong>，具体步骤如下：\u003C\u002Fp>\n\u003Col data-line=\"151\">\n\u003Cli data-line=\"151\">\n\u003Cp data-line=\"151\">初始化左边界\u003Ccode>left=0\u003C\u002Fcode>、右边界\u003Ccode>right=数组长度-1\u003C\u002Fcode>，同时初始化\u003Ccode>nearestIndex\u003C\u002Fcode>（保存最接近元素索引，初始值可设为0）；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"153\">\n\u003Cp data-line=\"153\">计算中间索引\u003Ccode>mid = left + (right - left) \u002F 2\u003C\u002Fcode>；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"155\">\n\u003Cp data-line=\"155\">比较\u003Ccode>nums[mid]\u003C\u002Fcode>与\u003Ccode>target\u003C\u002Fcode>的差值绝对值，若当前\u003Ccode>nums[mid]\u003C\u002Fcode>比\u003Ccode>nums[nearestIndex]\u003C\u002Fcode>更接近\u003Ccode>target\u003C\u002Fcode>，则更新\u003Ccode>nearestIndex = mid\u003C\u002Fcode>；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"157\">\n\u003Cp data-line=\"157\">按照精准查找的逻辑调整查找边界（寻找精准匹配值）：\u003C\u002Fp>\n\u003Cul data-line=\"159\">\n\u003Cli data-line=\"159\">\n\u003Cp data-line=\"159\">若\u003Ccode>nums[mid] == target\u003C\u002Fcode>：直接返回\u003Ccode>mid\u003C\u002Fcode>（精准匹配，无需继续查找）；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"161\">\n\u003Cp data-line=\"161\">若\u003Ccode>nums[mid] &gt; target\u003C\u002Fcode>：调整\u003Ccode>right = mid - 1\u003C\u002Fcode>；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"163\">\n\u003Cp data-line=\"163\">若\u003Ccode>nums[mid] &lt; target\u003C\u002Fcode>：调整\u003Ccode>left = mid + 1\u003C\u002Fcode>；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"165\">\n\u003Cp data-line=\"165\">重复步骤2-4，直到查找区间失效（\u003Ccode>left &gt; right\u003C\u002Fcode>）；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"167\">\n\u003Cp data-line=\"167\">区间失效后，返回记录的\u003Ccode>nearestIndex\u003C\u002Fcode>（即最接近目标值的元素索引）。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"169\" id=\"2.  Java代码实现（迭代优先，避免栈溢出）\">2.  Java代码实现（迭代优先，避免栈溢出）\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"171\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">Java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-Java\" language=Java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ApproximateBinarySearch\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-comment\">\u002F**\n     * 迭代式近似二分查找（查找最接近目标值的元素索引）\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> nums 升序有序数组\n     * \u003Cspan class=\"hljs-doctag\">@param\u003C\u002Fspan> target 待查找的目标值\n     * \u003Cspan class=\"hljs-doctag\">@return\u003C\u002Fspan> 最接近目标值的元素索引（数组为空返回-1）\n     *\u002F\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">approximateBinarySearch\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] nums, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> target)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 边界校验：数组为空或长度为0，返回-1\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums == \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan> || nums.length == \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> -\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n        }\n\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">left\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">right\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> nums.length - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">nearestIndex\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 初始化最接近元素索引\u003C\u002Fspan>\n\n        \u003Cspan class=\"hljs-keyword\">while\u003C\u002Fspan> (left &lt;= right) {\n            \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">mid\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> left + (right - left) \u002F \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>;\n\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 核心：更新最接近元素的索引\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 比较当前mid对应元素与已有最接近元素的差值绝对值\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (Math.abs(nums[mid] - target) &lt; Math.abs(nums[nearestIndex] - target)) {\n                nearestIndex = mid;\n            }\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 特殊情况：若两个元素与目标值差值相等，可选择保留左侧元素（或右侧，按需调整）\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (Math.abs(nums[mid] - target) == Math.abs(nums[nearestIndex] - target)) {\n                \u003Cspan class=\"hljs-comment\">\u002F\u002F 此处选择保留索引较小的元素（即左侧元素），可根据业务需求修改\u003C\u002Fspan>\n                nearestIndex = Math.min(nearestIndex, mid);\n            }\n\n            \u003Cspan class=\"hljs-comment\">\u002F\u002F 精准匹配时，直接返回mid\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums[mid] == target) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> mid;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (nums[mid] &gt; target) {\n                right = mid - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> {\n                left = mid + \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n            }\n        }\n\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 区间失效，返回最接近元素的索引\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> nearestIndex;\n    }\n\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 测试方法\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] sortedNums = {\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">7\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">9\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">11\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">13\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">15\u003C\u002Fspan>};\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetNotExist\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">8\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 不存在的目标值，最接近7（索引3）和9（索引4）\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetExist\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">7\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 存在的目标值\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetEdge\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 小于数组所有元素，最接近1（索引0）\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">targetEdge2\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">16\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 大于数组所有元素，最接近15（索引7）\u003C\u002Fspan>\n\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index1\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> approximateBinarySearch(sortedNums, targetNotExist);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index2\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> approximateBinarySearch(sortedNums, targetExist);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index3\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> approximateBinarySearch(sortedNums, targetEdge);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">index4\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> approximateBinarySearch(sortedNums, targetEdge2);\n\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;与 &quot;\u003C\u002Fspan> + targetNotExist + \u003Cspan class=\"hljs-string\">&quot; 最接近的元素索引：&quot;\u003C\u002Fspan> + index1 + \u003Cspan class=\"hljs-string\">&quot;，对应元素：&quot;\u003C\u002Fspan> + sortedNums[index1]); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出3，对应7\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;与 &quot;\u003C\u002Fspan> + targetExist + \u003Cspan class=\"hljs-string\">&quot; 最接近的元素索引：&quot;\u003C\u002Fspan> + index2 + \u003Cspan class=\"hljs-string\">&quot;，对应元素：&quot;\u003C\u002Fspan> + sortedNums[index2]); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出3，对应7\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;与 &quot;\u003C\u002Fspan> + targetEdge + \u003Cspan class=\"hljs-string\">&quot; 最接近的元素索引：&quot;\u003C\u002Fspan> + index3 + \u003Cspan class=\"hljs-string\">&quot;，对应元素：&quot;\u003C\u002Fspan> + sortedNums[index3]); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出0，对应1\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;与 &quot;\u003C\u002Fspan> + targetEdge2 + \u003Cspan class=\"hljs-string\">&quot; 最接近的元素索引：&quot;\u003C\u002Fspan> + index4 + \u003Cspan class=\"hljs-string\">&quot;，对应元素：&quot;\u003C\u002Fspan> + sortedNums[index4]); \u003Cspan class=\"hljs-comment\">\u002F\u002F 输出7，对应15\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"239\" id=\"3.  适用场景\">3.  适用场景\u003C\u002Fh3>\n\u003Cp data-line=\"241\">近似查找适用于\u003Cstrong>无需精准匹配，仅需获取与目标值最接近的元素\u003C\u002Fstrong>的场景，常见示例：\u003C\u002Fp>\n\u003Col data-line=\"243\">\n\u003Cli data-line=\"243\">\n\u003Cp data-line=\"243\">价格匹配系统：如电商平台中，用户输入一个心理价格，快速找到最接近该价格的商品（无需价格完全一致）；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"245\">\n\u003Cp data-line=\"245\">温度\u002F湿度等传感器数据：如在有序的历史传感器数据中，查找与当前监测值最接近的历史数据，用于趋势分析；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"247\">\n\u003Cp data-line=\"247\">模糊查询补全：如通讯录按拼音首字母有序排列，用户输入错误拼音时，返回最接近的联系人；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"249\">\n\u003Cp data-line=\"249\">阈值匹配：如在有序的评分区间数组中，用户分数未精准匹配任何阈值时，找到最接近的阈值，确定对应的等级（如考试分数61分，最接近60分及格线）；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"251\">\n\u003Cp data-line=\"251\">地理坐标查找：在有序的经纬度数组中，查找与目标坐标最接近的地点，实现附近地点推荐的基础功能。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 data-line=\"253\" id=\"三、 精准查找与近似查找核心对比\">三、 精准查找与近似查找核心对比\u003C\u002Fh2>\n\u003Ctable data-line=\"255\">\n\u003Cthead data-line=\"255\">\n\u003Ctr data-line=\"255\">\n\u003Cth>对比维度\u003C\u002Fth>\n\u003Cth>精准查找\u003C\u002Fth>\n\u003Cth>近似查找\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody data-line=\"257\">\n\u003Ctr data-line=\"257\">\n\u003Ctd>核心目标\u003C\u002Ftd>\n\u003Ctd>精准匹配目标值，返回索引\u003C\u002Ftd>\n\u003Ctd>找到最接近目标值的元素索引\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"258\">\n\u003Ctd>未找到目标值时\u003C\u002Ftd>\n\u003Ctd>返回约定标识（如-1）\u003C\u002Ftd>\n\u003Ctd>返回最接近元素的有效索引\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"259\">\n\u003Ctd>核心扩展\u003C\u002Ftd>\n\u003Ctd>无额外逻辑\u003C\u002Ftd>\n\u003Ctd>记录并更新最接近元素索引\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"260\">\n\u003Ctd>时间复杂度\u003C\u002Ftd>\n\u003Ctd>O(log n)\u003C\u002Ftd>\n\u003Ctd>O(log n)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"261\">\n\u003Ctd>空间复杂度（迭代）\u003C\u002Ftd>\n\u003Ctd>O(1)\u003C\u002Ftd>\n\u003Ctd>O(1)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"262\">\n\u003Ctd>空间复杂度（递归）\u003C\u002Ftd>\n\u003Ctd>O(log n)\u003C\u002Ftd>\n\u003Ctd>O(log n)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"263\">\n\u003Ctd>核心特性\u003C\u002Ftd>\n\u003Ctd>存在性判断+精准定位\u003C\u002Ftd>\n\u003Ctd>模糊匹配+邻近值获取\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 data-line=\"264\" id=\"四、 总结\">四、 总结\u003C\u002Fh2>\n\u003Col data-line=\"266\">\n\u003Cli data-line=\"266\">\n\u003Cp data-line=\"266\">二分查找的两大核心类型（精准查找、近似查找）均基于分治思想，时间复杂度均为O(log n)，仅在功能目标和逻辑细节上存在差异；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"268\">\n\u003Cp data-line=\"268\">精准查找是基础，适用于需要明确存在性判断和精准索引的场景，未找到目标值时返回-1，迭代实现更安全高效；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"270\">\n\u003Cp data-line=\"270\">近似查找是精准查找的扩展，适用于模糊匹配场景，通过记录最接近元素索引，在目标值不存在时返回有效结果；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"272\">\n\u003Cp data-line=\"272\">实际开发中，需根据业务需求选择：若需精准匹配（如ID查询），使用精准查找；若需邻近值匹配（如价格推荐），使用近似查找。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n",7161,23,"0","",2,0,154,"查找,精准,接近,索引,元素","二分查找的两种核心类型：精准查找与近似查找（Java实现与场景分析）\n前言\n二分查找（Binary Search）作为有序数组的高效查找算法，其时间复杂度为O(log n)，远优于线性查找的O(n)。根据查找需求的不同，二分查找可分为两大核心类型：精准查找与近似查找。","2026-01-05 14:36:49"]