淘宝客网站主题下载,游戏培训学校,seo职位,做网站常用哪种语言二分算法深度解析 一、二分算法基础概念1.1 算法核心思想1.2 算法基本流程1.3 算法复杂度分析1.4 算法正确性证明 二、二分算法基础实现2.1 基本二分查找#xff08;有序数组#xff09;2.2 二分查找的递归实现2.3 二分查找的常见错误 三、二分算法变种问题3.1 查找第一个等于… 二分算法深度解析 一、二分算法基础概念1.1 算法核心思想1.2 算法基本流程1.3 算法复杂度分析1.4 算法正确性证明 二、二分算法基础实现2.1 基本二分查找有序数组2.2 二分查找的递归实现2.3 二分查找的常见错误 三、二分算法变种问题3.1 查找第一个等于目标值的位置3.2 查找最后一个等于目标值的位置3.3 查找第一个大于等于目标值的位置3.4 查找最后一个小于等于目标值的位置 四、二分算法在特殊数组中的应用4.1 在旋转有序数组中搜索4.2 寻找峰值4.3 在二维有序矩阵中搜索 五、二分答案思想与应用5.1 二分答案的核心思想5.2 经典应用分割数组的最大值5.3 经典应用寻找最小的k满足条件 六、二分算法的优化与技巧6.1 避免mid计算溢出6.2 浮点数二分6.3 三分查找适用于单峰函数 七、二分算法实际应用场景7.1 数据搜索与查询7.2 算法优化7.3 科学计算与数值分析7.4 工程实践 二分算法Binary Search Algorithm是一种高效的搜索策略思想简洁而强大从基本的有序数组搜索到复杂的算法问题求解以其对数级的时间复杂度成为算法设计中的核心技术之一。本文我将系统讲解二分算法的核心原理、常见变种、实现细节、应用及优化技巧带你全面掌握这一基础而重要的算法。
一、二分算法基础概念
1.1 算法核心思想
二分算法又称二分查找或折半查找其核心思想是通过不断将搜索区间减半逐步缩小目标元素的可能位置从而在对数时间内完成搜索。该算法的基本前提是数据结构有序通过比较中间元素与目标值的大小关系决定下一步搜索的区间直至找到目标元素或确定目标元素不存在。
1.2 算法基本流程
初始化确定搜索区间的左右边界通常为left0和rightn-1假设数组长度为n。计算中间位置计算区间中间位置mid left (right - left) / 2避免溢出的写法为mid left ((right - left) 1)。比较与缩小区间 若中间元素等于目标值返回中间位置。若中间元素大于目标值更新右边界为mid - 1在左半区间继续搜索。若中间元素小于目标值更新左边界为mid 1在右半区间继续搜索。 终止条件当left right时搜索区间为空目标元素不存在。
1.3 算法复杂度分析
时间复杂度二分算法的时间复杂度为 O ( log n ) O(\log n) O(logn)其中n为搜索空间的大小。每次迭代将搜索区间减半因此最多需要 log 2 n \log_2 n log2n次迭代。空间复杂度通常为 O ( 1 ) O(1) O(1)仅使用常数级别的额外空间。
1.4 算法正确性证明
二分算法的正确性可以通过数学归纳法证明
当搜索区间长度为1时算法正确判断元素是否存在。假设搜索区间长度为k时算法正确当长度为k1时通过比较中间元素将问题分解为长度不超过k/2的子问题由归纳假设知子问题正确故原问题正确。
二、二分算法基础实现
2.1 基本二分查找有序数组
public class BinarySearch {/*** 在有序数组中查找目标值的索引* param nums 有序数组* param target 目标值* return 目标值的索引不存在返回-1*/public int search(int[] nums, int target) {int left 0, right nums.length - 1;while (left right) {int mid left ((right - left) 1); // 避免溢出的mid计算if (nums[mid] target) {return mid;} else if (nums[mid] target) {left mid 1;} else {right mid - 1;}}return -1;}public static void main(String[] args) {BinarySearch bs new BinarySearch();int[] nums {1, 3, 5, 7, 9, 11, 13};System.out.println(bs.search(nums, 7)); // 输出3System.out.println(bs.search(nums, 8)); // 输出-1}
}2.2 二分查找的递归实现
public class RecursiveBinarySearch {public int search(int[] nums, int target) {return recursiveSearch(nums, target, 0, nums.length - 1);}private int recursiveSearch(int[] nums, int target, int left, int right) {if (left right) {return -1;}int mid left ((right - left) 1);if (nums[mid] target) {return mid;} else if (nums[mid] target) {return recursiveSearch(nums, target, mid 1, right);} else {return recursiveSearch(nums, target, left, mid - 1);}}
}2.3 二分查找的常见错误 边界条件处理错误 终止条件应为left right而非left right否则可能漏掉最后一个元素。更新边界时应为left mid 1和right mid - 1避免陷入死循环。 mid计算溢出 错误写法mid (left right) / 2当left和right接近整数最大值时可能溢出。正确写法mid left ((right - left) 1)使用减法和移位避免溢出。 返回条件错误 找到目标值后应立即返回避免继续无效搜索。
三、二分算法变种问题
3.1 查找第一个等于目标值的位置
public class FirstEqual {public int searchInsert(int[] nums, int target) {int left 0, right nums.length - 1;while (left right) {int mid left ((right - left) 1);if (nums[mid] target) {right mid - 1;} else {left mid 1;}}return left;}public static void main(String[] args) {FirstEqual fe new FirstEqual();int[] nums {1, 3, 5, 7, 9};System.out.println(fe.searchInsert(nums, 6)); // 输出3}
}3.2 查找最后一个等于目标值的位置
public class LastEqual {public int search(int[] nums, int target) {int left 0, right nums.length - 1;while (left right) {int mid left ((right - left) 1);if (nums[mid] target) {left mid 1;} else {right mid - 1;}}return right;}
}3.3 查找第一个大于等于目标值的位置
public class FirstGreaterEqual {public int search(int[] nums, int target) {int left 0, right nums.length - 1;while (left right) {int mid left ((right - left) 1);if (nums[mid] target) {right mid - 1;} else {left mid 1;}}return left;}
}3.4 查找最后一个小于等于目标值的位置
public class LastLessEqual {public int search(int[] nums, int target) {int left 0, right nums.length - 1;while (left right) {int mid left ((right - left) 1);if (nums[mid] target) {left mid 1;} else {right mid - 1;}}return right;}
}四、二分算法在特殊数组中的应用
4.1 在旋转有序数组中搜索
public class SearchInRotatedArray {public int search(int[] nums, int target) {if (nums null || nums.length 0) {return -1;}int left 0, right nums.length - 1;while (left right) {int mid left ((right - left) 1);if (nums[mid] target) {return mid;}// 左半部分有序if (nums[left] nums[mid]) {if (nums[left] target target nums[mid]) {right mid - 1;} else {left mid 1;}} else { // 右半部分有序if (nums[mid] target target nums[right]) {left mid 1;} else {right mid - 1;}}}return -1;}
}4.2 寻找峰值
public class FindPeakElement {public int findPeakElement(int[] nums) {int left 0, right nums.length - 1;while (left right) {int mid left ((right - left) 1);if (nums[mid] nums[mid 1]) {// 峰值在左半部分right mid;} else {// 峰值在右半部分left mid 1;}}return left;}
}4.3 在二维有序矩阵中搜索
public class Search2DMatrix {public boolean searchMatrix(int[][] matrix, int target) {if (matrix null || matrix.length 0 || matrix[0].length 0) {return false;}int rows matrix.length;int cols matrix[0].length;int left 0, right rows * cols - 1;while (left right) {int mid left ((right - left) 1);int row mid / cols;int col mid % cols;if (matrix[row][col] target) {return true;} else if (matrix[row][col] target) {left mid 1;} else {right mid - 1;}}return false;}
}五、二分答案思想与应用
5.1 二分答案的核心思想
二分答案是二分算法的一种高级应用适用于求解最大化最小值或最小化最大值类型的问题。其核心思想是
将求解问题转化为判断问题。确定答案的可能范围左边界和右边界。对可能的答案进行二分搜索每次判断该答案是否可行。根据判断结果调整搜索范围最终得到最优解。
5.2 经典应用分割数组的最大值
public class SplitArray {public int splitArray(int[] nums, int m) {int left 0, right 0;for (int num : nums) {left Math.max(left, num); // 左边界为数组中的最大值right num; // 右边界为数组总和}while (left right) {int mid left ((right - left) 1);if (isValid(nums, m, mid)) {right mid;} else {left mid 1;}}return left;}private boolean isValid(int[] nums, int m, int maxSum) {int count 1;int currentSum 0;for (int num : nums) {if (currentSum num maxSum) {count;currentSum num;if (count m) {return false;}} else {currentSum num;}}return true;}
}5.3 经典应用寻找最小的k满足条件
public class FindMinK {public int findMinK(int[] nums, int target) {int left 0, right nums.length - 1;int result -1;while (left right) {int mid left ((right - left) 1);if (isSatisfied(nums, mid, target)) {result mid;right mid - 1; // 寻找更小的k} else {left mid 1;}}return result;}private boolean isSatisfied(int[] nums, int k, int target) {// 判断k是否满足条件// 具体逻辑根据问题而定return nums[k] target;}
}六、二分算法的优化与技巧
6.1 避免mid计算溢出
// 错误写法可能溢出
int mid (left right) / 2;// 正确写法推荐
int mid left ((right - left) 1);// 另一种正确写法
int mid left (right - left) / 2;6.2 浮点数二分
public class FloatingBinarySearch {public double findRoot(double n) {double left 0, right n;// 浮点数二分需要设置精度final double EPS 1e-10;while (right - left EPS) {double mid left (right - left) / 2;if (mid * mid n) {left mid;} else {right mid;}}return left;}
}6.3 三分查找适用于单峰函数
public class TernarySearch {public double findMax(double[] nums) {double left 0, right nums.length - 1;final double EPS 1e-10;while (right - left EPS) {double mid1 left (right - left) / 3;double mid2 right - (right - left) / 3;if (nums[(int)mid1] nums[(int)mid2]) {left mid1;} else {right mid2;}}return nums[(int)left];}
}七、二分算法实际应用场景
7.1 数据搜索与查询
数据库索引查询B树和B树的查找过程本质上是多路二分搜索。有序数组中的快速查找如Java的Arrays.binarySearch()方法。
7.2 算法优化
快速排序中的分区优化通过二分思想优化基准值的选择。动态规划中的状态优化如使用二分查找减少状态转移的时间。
7.3 科学计算与数值分析
求解方程近似解如二分法求解非线性方程的根。数值积分与优化结合二分思想进行数值计算。
7.4 工程实践
网络协议中的滑动窗口大小调整。系统资源分配中的阈值确定。机器学习中的超参数优化。 That’s all, thanks for reading! 觉得有用就点个赞、收进收藏夹吧关注我获取更多干货
文章转载自: http://www.morning.yllym.cn.gov.cn.yllym.cn http://www.morning.lfxcj.cn.gov.cn.lfxcj.cn http://www.morning.hnrls.cn.gov.cn.hnrls.cn http://www.morning.cnwpb.cn.gov.cn.cnwpb.cn http://www.morning.kpgft.cn.gov.cn.kpgft.cn http://www.morning.kxxld.cn.gov.cn.kxxld.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.lpzqd.cn.gov.cn.lpzqd.cn http://www.morning.wnjrf.cn.gov.cn.wnjrf.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.zcnwg.cn.gov.cn.zcnwg.cn http://www.morning.ygkq.cn.gov.cn.ygkq.cn http://www.morning.bxczt.cn.gov.cn.bxczt.cn http://www.morning.jwmws.cn.gov.cn.jwmws.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.rdkgw.cn.gov.cn.rdkgw.cn http://www.morning.fnhxp.cn.gov.cn.fnhxp.cn http://www.morning.yqpck.cn.gov.cn.yqpck.cn http://www.morning.hclqy.cn.gov.cn.hclqy.cn http://www.morning.dcccl.cn.gov.cn.dcccl.cn http://www.morning.lxqkt.cn.gov.cn.lxqkt.cn http://www.morning.lcbnb.cn.gov.cn.lcbnb.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.nchsz.cn.gov.cn.nchsz.cn http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn http://www.morning.ljcjc.cn.gov.cn.ljcjc.cn http://www.morning.bflws.cn.gov.cn.bflws.cn http://www.morning.kscwt.cn.gov.cn.kscwt.cn http://www.morning.rrms.cn.gov.cn.rrms.cn http://www.morning.nsfxt.cn.gov.cn.nsfxt.cn http://www.morning.jghty.cn.gov.cn.jghty.cn http://www.morning.dbcw.cn.gov.cn.dbcw.cn http://www.morning.kwcnf.cn.gov.cn.kwcnf.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.fbpyd.cn.gov.cn.fbpyd.cn http://www.morning.wtrjq.cn.gov.cn.wtrjq.cn http://www.morning.ndzhl.cn.gov.cn.ndzhl.cn http://www.morning.rmfh.cn.gov.cn.rmfh.cn http://www.morning.ftzll.cn.gov.cn.ftzll.cn http://www.morning.bnylg.cn.gov.cn.bnylg.cn http://www.morning.rfldz.cn.gov.cn.rfldz.cn http://www.morning.ltspm.cn.gov.cn.ltspm.cn http://www.morning.pqhfx.cn.gov.cn.pqhfx.cn http://www.morning.yhwmg.cn.gov.cn.yhwmg.cn http://www.morning.ftlgy.cn.gov.cn.ftlgy.cn http://www.morning.yltnl.cn.gov.cn.yltnl.cn http://www.morning.ndyrb.com.gov.cn.ndyrb.com http://www.morning.mhpmw.cn.gov.cn.mhpmw.cn http://www.morning.ryysc.cn.gov.cn.ryysc.cn http://www.morning.tjmfz.cn.gov.cn.tjmfz.cn http://www.morning.nclps.cn.gov.cn.nclps.cn http://www.morning.ndxrm.cn.gov.cn.ndxrm.cn http://www.morning.wpmlp.cn.gov.cn.wpmlp.cn http://www.morning.pdxqk.cn.gov.cn.pdxqk.cn http://www.morning.zfkxj.cn.gov.cn.zfkxj.cn http://www.morning.qnbgh.cn.gov.cn.qnbgh.cn http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.wdhhz.cn.gov.cn.wdhhz.cn http://www.morning.btlmb.cn.gov.cn.btlmb.cn http://www.morning.mtrfz.cn.gov.cn.mtrfz.cn http://www.morning.jrqcj.cn.gov.cn.jrqcj.cn http://www.morning.kfstq.cn.gov.cn.kfstq.cn http://www.morning.jfwrf.cn.gov.cn.jfwrf.cn http://www.morning.hsksm.cn.gov.cn.hsksm.cn http://www.morning.rfbt.cn.gov.cn.rfbt.cn http://www.morning.ztcxx.com.gov.cn.ztcxx.com http://www.morning.jxcwn.cn.gov.cn.jxcwn.cn http://www.morning.lrplh.cn.gov.cn.lrplh.cn http://www.morning.nxfwf.cn.gov.cn.nxfwf.cn http://www.morning.npqps.cn.gov.cn.npqps.cn http://www.morning.gccdr.cn.gov.cn.gccdr.cn http://www.morning.tmzlt.cn.gov.cn.tmzlt.cn http://www.morning.dfmjm.cn.gov.cn.dfmjm.cn http://www.morning.kgqpx.cn.gov.cn.kgqpx.cn http://www.morning.mymz.cn.gov.cn.mymz.cn http://www.morning.gwtbn.cn.gov.cn.gwtbn.cn http://www.morning.xzqzd.cn.gov.cn.xzqzd.cn http://www.morning.dmfdl.cn.gov.cn.dmfdl.cn http://www.morning.wrtpk.cn.gov.cn.wrtpk.cn http://www.morning.xyrw.cn.gov.cn.xyrw.cn