📌  相关文章
📜  C++中对数组中lower_bound()和upper_bound()的实现(1)

📅  最后修改于: 2023-12-03 14:59:49.982000             🧑  作者: Mango

C++中对数组中lower_bound()和upper_bound()的实现

介绍

在进行二分查找时,除了要判断目标值是否等于中间值,还需要考虑目标值在中间值的左侧还是右侧,这时就需要用到lower_bound()和upper_bound()两个函数。

lower_bound()函数在有序数组中查找大于或等于目标值的第一个位置,upper_bound()函数在有序数组中查找大于目标值的第一个位置。

在C++中,这两个函数被定义在头文件中。

lower_bound()的实现

下面是lower_bound()函数的实现方式:

template <class T>
int lower_bound(T arr[], int len, T x) { 
    int l = 0, r = len -1;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (arr[mid] >= x) {
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return l;
}

这段代码中,我们使用了二分查找的思想,首先将左端点l和右端点r初始化为0和len - 1,然后计算mid = (l + r) / 2;

接下来,分两种情况进行判断:

  • 如果arr[mid] >= x,则说明目标值可能在arr[mid]的左侧或等于mid的位置,因此将右端点r更新为mid - 1;
  • 如果arr[mid] < x,则说明目标值在arr[mid]的右侧,因此将左端点l更新为mid + 1。

最终返回的l值即为大于或等于目标值的第一个位置。

upper_bound()的实现

下面是upper_bound()函数的实现方式:

template <class T>
int upper_bound(T arr[], int len, T x) { 
    int l = 0, r = len -1;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (arr[mid] <= x) {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    return l;
}

这段代码与lower_bound()的实现方式很类似,唯一的不同点是在判断条件中将大于等于的符号改为了小于等于的符号。

最终返回的l值即为大于目标值的第一个位置。

总结

通过上述代码片段的讲解,我们对C++中两个有序函数——lower_bound()和upper_bound()有了初步的了解。

当需要查找数组中大于或等于目标值的第一个位置时,就可以使用lower_bound()函数;当需要查找数组中大于目标值的第一个位置时,就可以使用upper_bound()函数。

这两个函数可以极大地简化代码,在处理有序数组时非常方便。