二分查找

二分查找:效率的典范

在无序中寻找目标,我们只能逐一排查(O(n))。但如果数据已经排好队,我们有一种聪明得多的方法——二分查找。它每次将搜索范围砍掉一半,是对“分治”思想最纯粹、最经典的诠释,堪称效率的典范。

二分查找的基本思想

想象在电话簿中找名字。你不会从第一页开始翻,而是先打开中间,看目标名字在左半部分还是右半部分,然后丢弃无关的一半,在剩下的一半中重复此过程。这就是二分查找,前提是数据必须有序

为什么需要二分查找?

它将线性搜索的 O(n) 复杂度提升到了惊人的 O(log n)。这意味着,在10亿条数据中找一个元素,线性搜索最坏需要10亿次比较,而二分查找最多只需约30次!这种指数级的效率提升,是处理大规模有序数据的基石。

清晰的算法框架

二分查找的难点在于边界条件的处理(< 还是 <=mid+1 还是 mid-1)。掌握一个清晰的框架至关重要。

// 在升序数组nums中查找目标值target,返回其索引,找不到则返回-1
int binarySearch(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1; // 定义搜索区间为[left, right]
    while (left <= right) { // 区间有效时继续
        int mid = left + (right - left) / 2; // 防止溢出
        if (nums[mid] == target) return mid;
        else if (nums[mid] < target) left = mid + 1; // 目标在右半部分
        else right = mid - 1; // 目标在左半部分
    }
    return -1; // 区间为空,未找到
}

二分查找的应用场景

它远不止于在数组中找一个数。任何具有单调性的问题都可以尝试二分思想:

  • 在连续函数中求根。
  • 寻找旋转排序数组中的最小值。
  • 计算平方根。
  • 分配问题中的“最大值最小化”(如船运货物)。

总结

二分查找的魅力在于其简洁而强大的思想。它教会我们,通过对问题的巧妙划分和条件的有效利用,可以极大地缩小解空间。

posted @ 2026-01-18 17:08  f-52Hertz  阅读(3)  评论(0)    收藏  举报