二分查找

二分查找

1. 二分查找的前提
  • 适用数据结构:只能对数组或类似数组的容器(如vector)进行二分查找

  • 单调性要求

    • 数组元素必须保持单调性,一般为单调不减(允许相等元素)

    • 单调不增数组也可使用,但需要修改比较函数(方法与sort自定义比较类似)

2. binary_search函数
  • 功能:在已排序序列中检查目标元素是否存在

  • 返回值:布尔值(true/false),表示查找结果

  • 参数格式:binary_search(numbers.begin(),numbers.end(),target)

  • 使用注意

    • 无法直接获取元素位置,仅返回存在性判断

    • 如需获取位置信息,需配合lower_bound/upper_bound使用

  • 示例流程

    • 对vector排序(如[1,3,5,7,9])

    • 调用binary_search查找target

    • 根据返回值输出相应提示信息

3. lower_bound和upper_bound函数
  • 共同前提:数组必须为非降序(可通过自定义比较函数处理非升序数组)

  • lower_bound

    • 返回[st,ed)范围内第一个大于等于x的元素的地址(地址-首地址=下标)

    • 获取下标方法:lower_bound(...) - 首地址

    • lower_bound(v.begin(),v.end(),8)-v.begin())

  • upper_bound

    • 返回[st,ed)范围内第一个严格大于x的元素的地址

    • 不存在时两者都返回end()(最后一个元素的下一个位置)

  • 应用场景

    • 确定元素出现区间:[lower_bound, upper_bound)为x的完整出现范围

    • 示例:在排序后的[1,3,5,7,9,10,18]中查找8,lower_bound返回9的位置(下标4)

4.应用案例

  • 复杂度对比

    • 暴力查找:O(n)时间复杂度

    • 二分查找:O(logn)时间复杂度,效率显著提升

posted @ 2026-04-08 13:14  Sherry_pro  阅读(28)  评论(0)    收藏  举报