二分法问题及其边界条件的探讨

本文探讨了二分法在处理边界条件时的重要性,解释了如何避免数值溢出并防止结果错误。通过分析LeetCode的69题和35题,总结了不同场景下的二分查找边界条件,区分了[left,right)和[left,right]两种情况,并提供了相应的代码实现。" 132154949,7144079,EEMD与改进鲸鱼算法优化的SVM电力负荷预测,"['支持向量机', '机器学习', '算法优化', '电力系统', '预测模型']
摘要由CSDN通过智能技术生成

看二分法的一句代码,很有意思:

int mid = low + ((high - low) / 2);

这个与二分法求两数平均值的结果是一样的,为什么要这样写呢?

查阅资料后很好理解,这是为了避免数值溢出的问题。如果直接按照原来的思路来写:

int mid = (low + high) / 2;

C++本身对int类型的字符就有4Bytes(32位)的存储上限要求,也就是说int类型的字符的取值范围在-2^32~(2^32-1)。如果low和high本身就达到范围值了怎么办?就会造成报错溢出。

平时习惯用Python写,Python3避免了这个问题,只要不超出内存范围,就不需要Codinger设计担心这个问题。

有好的习惯,还可以写成:

int mid = (low+high)>>>1;

值得注意的是,这样写虽然可以避免溢出,但是会造成结果错误的情况:

int mid = high/2+ low/2;

当high或者low中两者都为奇数时,结果会错。

eg:high=3 low=5 则mid本应该等于4,但是这种算法算出来为1+2=3!!

对二分法的好处理(骚操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值