二分知识点

二分查找的基本概念

二分查找是一种在有序数组中查找特定元素的高效算法。通过每次将搜索范围减半,时间复杂度可降至O(log n),远优于线性查找的O(n)。

二分查找的实现

标准二分查找的实现需要维护三个指针:左边界left、右边界right和中间点mid。每次迭代根据mid处的值与目标值的比较结果调整搜索范围。

int binarySearch(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) return mid;
        if (nums[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1;
}

边界条件处理

二分查找的边界条件容易出错。常见问题包括:

  • 循环条件应为left <= right而非left < right,否则可能漏查边界元素
  • 计算mid时使用left + (right - left) / 2可避免整数溢出
  • 更新边界时需明确mid ± 1,防止死循环

变种与应用

二分查找有多种变体,适用于不同场景:

  1. 查找第一个大于等于目标的元素
int lowerBound(vector<int>& nums, int target) {
    int left = 0, right = nums.size();
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) left = mid + 1;
        else right = mid;
    }
    return left;
}

  1. 在旋转有序数组中查找
int searchRotated(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        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;
}

性能优化

现代CPU的缓存机制使二分查找的实际性能可能优于理论预期。可通过以下方式优化:

  • 使用迭代而非递归减少函数调用开销
  • 对小型数组切换为线性查找
  • 使用位运算替代除法计算mid

常见错误与调试

调试二分查找时建议:

  • 打印每次迭代的leftrightmid
  • 测试空数组、单元素数组等边界情况
  • 验证数组中存在重复元素时的行为

数学基础

二分查找的正确性基于循环不变式:

  • 初始化:首次循环前,目标值在[left, right]范围内
  • 保持:每次迭代后目标值仍在新的[left, right]范围内
  • 终止:当left > right时,区间为空说明目标不存在

时间复杂度推导: [ T(n) = T(n/2) + O(1) ] 通过主定理可得: [ T(n) = O(\log n) ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨染千千秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值