当前位置: 首页 > news >正文

C++ 二分法中向下取整与向上取整的区别与应用场景详解

        在 C++ 中,向下取整 和 向上取整 是二分法中常见的两种计算中间值的方式。它们的选择会影响二分法的行为,尤其是在区间划分和边界条件处理上。以下是它们的区别、使用场景和特点:


目录

1. 向下取整

2. 向上取整

3. 区别对比

4. 使用场景示例

向下取整(标准二分查找)

向上取整(偏向右侧划分)

5. 如何选择?

向下取整:

二分法通常采用向下取整的原因主要有以下几点:

向上取整:

6. 总结


1. 向下取整

  • 定义:
            向下取整是指计算中间值时,结果向较小的整数方向取整。例如,(left + right) / 2 或 left + (right - left) / 2

  • 特点

    • 结果是区间中靠左的中间值。

    • 适合大多数二分查找问题。

    • 在区间缩小到两个元素时,向下取整会选择左元素,避免重复选择右元素。

  • 使用场景

    • 标准二分查找。

    • 区间更新方式为 left = mid + 1 和 right = mid 时。

    • 需要避免无限循环的情况。

  • 示例

    int mid = left + (right - left) / 2;  // 向下取整

2. 向上取整

  • 定义
    向上取整是指计算中间值时,结果向较大的整数方向取整。例如,left + (right - left + 1) / 2

  • 特点

    • 结果是区间中靠右的中间值。

    • 适合需要偏向右侧划分区间的情况。

    • 在区间缩小到两个元素时,向上取整会选择右元素,避免重复选择左元素。

  • 使用场景

    • 区间更新方式为 left = mid 和 right = mid - 1 时。

    • 需要快速缩小区间右侧的情况。

    • 某些特定问题(如浮点数二分、边界条件处理)。

  • 示例

    int mid = left + (right - left + 1) / 2;  // 向上取整

3. 区别对比

特性向下取整向上取整
计算方式mid = left + (right - left) / 2mid = left + (right - left + 1) / 2
中间值位置靠左靠右
适用区间更新left = mid + 1right = midleft = midright = mid - 1
避免循环避免重复选择右元素避免重复选择左元素
常见场景标准二分查找偏向右侧划分区间

4. 使用场景示例

向下取整(标准二分查找)

int binarySearch(const 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;
        } else if (nums[mid] < target) {
            left = mid + 1;  // 缩小左区间
        } else {
            right = mid - 1;  // 缩小右区间
        }
    }
    return -1;  // 未找到目标值
}

向上取整(偏向右侧划分)

int binarySearchRight(const vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int mid = left + (right - left + 1) / 2;  // 向上取整
        if (nums[mid] <= target) {
            left = mid;  // 缩小右区间
        } else {
            right = mid - 1;  // 缩小左区间
        }
    }
    return left;  // 返回目标值的右边界
}

5. 如何选择?

  • 向下取整

    • 当区间更新为 left = mid + 1 和 right = mid 时使用。

    • 适合大多数标准二分查找问题。

  • 二分法通常采用向下取整的原因主要有以下几点:

  1. 避免无限循环

            在二分查找中,如果使用向上取整,当区间缩小到两个元素时,可能会重复选择上界,导致无法缩小范围,形成无限循环。向下取整则能确保每次迭代区间都会缩小,避免这种情况。

  2. 保持一致性

    向下取整在大多数编程语言中是默认的整数除法行为,使用它可以减少额外的取整操作,保持代码简洁和一致性。

  3. 边界条件处理
           向下取整能更自然地处理边界条件,尤其是在数组或列表的索引操作中,确保索引不会超出范围。

  4. 算法终止
           向下取整能保证区间不断缩小,最终收敛到目标值或确定其不存在,确保算法在有限步骤内终止。

  5. 实现简单
           向下取整的实现通常更简单,计算效率也更高,适合在二分查找等需要频繁计算中间值的场景中使用。

  • 向上取整

    • 当区间更新为 left = mid 和 right = mid - 1 时使用。

    • 适合需要偏向右侧划分区间的情况。


6. 总结

  • 向下取整是默认选择,适合大多数二分查找问题,特点是中间值靠左,避免重复选择右元素。

  • 向上取整用于特定场景,特点是中间值靠右,避免重复选择左元素。

  • 选择的关键在于区间更新方式和问题需求,确保区间能正确缩小且不会陷入无限循环。

相关文章:

  • DeepSeek在赋能客户服务方面,3大业务场景落地
  • 【cuda学习日记】5.2 共享内存数据分布
  • 哔哩哔哩IT私塾python爬虫视频教程中的项目文件
  • python绘制cox列线图及绘制指南
  • Halcon 学习之路 set_grayval 算子
  • c++stl——容器
  • C++Qt学习笔记——实现一个串口通信界面
  • Debian安装C语言环境
  • DeepSeek开源:FlashMLA深度解析:Hopper架构上的大模型推理革命
  • 重大更新!锂电池剩余寿命预测新增 CALCE 数据集
  • 硬件基础(3):三极管(3):三极管作为开关的时候为什么设置其工作在截止区和饱和区
  • 达梦数据库中jdbc接口的大批量插入数据的写法推荐
  • 评估自动驾驶(AD)策略性能的关键指标
  • 数字化转型数据自动采集统计分析发那科(FANUC)数据采集
  • Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)
  • 过滤器 二、过滤器详解
  • VScode在windows10上使用clang-format
  • or-tools编译命令自用备注
  • Linux命令入门
  • 星座-从入门到精通
  • 新修订的《餐饮业促进和经营管理办法》公布,商务部解读
  • 李成钢出席中国与《数字经济伙伴关系协定》成员部级会议
  • 一涉嫌开设赌场的网上在逃人员在山东威海落网
  • 2000多年前的“新衣”长这样!马王堆文物研究新成果上新
  • 一船明月过沧州:为何这座城敢称“文武双全”?
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起