前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法小细节之数组某部分的中间位置的索引

算法小细节之数组某部分的中间位置的索引

作者头像
CoderJed
发布2018-09-30 10:21:11
8410
发布2018-09-30 10:21:11
举报
文章被收录于专栏:Jed的技术阶梯Jed的技术阶梯

给定一个数组的某个部分,这部分起始索引为L,结束索引为R,求这部分中间位置的索引。

1. int mid = (L + R) / 2

这个公式在数学上没有任何错误,通过这样的方式得到的mid值一定是L和R的中间值,但是在计算机中可能会造成数值越界的问题,如果L接近Integer.MAX_VALUE,R也接近Integer.MAX_VALUE,那么(L + R)将会越界,返回一个不正确的值,例如:

代码语言:javascript
复制
public static void main(String[] args) {

    int i1 = Integer.MAX_VALUE - 10;
    int i2 = Integer.MAX_VALUE - 20;
    int i3 = i1 + i2;
    
    System.out.println(i3);  // 结果是-32
}

虽然我们不会定义一个那么长的数组,但为了程序的绝对正确性,这个求中间索引的方法需要改进,就是下面的第二种方法。

2. int mid = L + (R - L) / 2

这种方法就避免了在计算机中的值越界问题,但还可以改进,看下面的第三种方法。

3. int mid = L + ((R - L) >> 1)

在计算机中,移位运算是要比算术运算的效率高的,我们知道,一个数右移一位的结果与这个数除以2的结果是相同的(关于位运算的详细介绍可以参考图解JAVA位运算),所以这样把除以2改为右移一位来提高运行效率。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. int mid = (L + R) / 2
  • 2. int mid = L + (R - L) / 2
  • 3. int mid = L + ((R - L) >> 1)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档