当前位置: 首页 > 知识库问答 >
问题:

关于二分查找算法找中间值,使用(start+end)/2与start+(end-start)/2两种方法区别?

东方谦
2023-05-18

问题背景

在做二分查找相关算法题的时候,发现很多人喜欢使用start+(end-start)/2来查找中间值,而不是常见的(start+end)/2,查阅资料,发现start+(end-start)/2可以有效避免int越界问题,但是不知道为什么,希望有大佬可以说一下原理

共有2个答案

吕学
2023-05-18

前提:start和end都在int范围内,并且作为下标,肯定start和end都大于等于0。

  1. (end-start)/2的差值肯定在int范围内,即使end是int的最大值,start是0(作为下标,最小只能是0),但除以2后向下取整,肯定也在int范围内;
  2. start再加上 end和start 之间差值的一半,连end超不过,肯定也超不过int的范围。

因此 start+(end-start)/2 可以避免int越界的问题。

(start+end)/2就不一定了,假如start和end都已经高过了int的中间值,两个数的和肯定就首先int越界了,再除以2已经晚了。

商经业
2023-05-18

用 start + (end - start) / 2 ,不会直接计算 start 和 end 的和,就算 start 和 end 都很大,(end - start) 的值依然在整数范围内

 类似资料:
  • 描述 (Description) slice( start, end )方法选择匹配元素的子集。 语法 (Syntax) 以下是使用此方法的简单语法 - <i>selector</i>.slice( start, end ) 参数 (Parameters) 以下是此方法使用的所有参数的说明 - start - 从哪里开始子集。 第一个元素为零。 从选择结束开始可以是否定的。 end - 从end

  • 相当于 Array.prototype.slice。 参数 名称 类型 默认值 描述 array [] 数组。 start number 起始下标。 end number 终止下标。 返回值 数组 array 在 start(包含)位置到 end(不包含)位置的浅拷贝数组,类型:[]。

  • 描述 (Description) KnockoutJS Observable slice()方法切出一个数组。 此处的切片与本机JavaScript切片功能相同。 返回从start-index到endindex的元素。 语法 (Syntax) arrayName.slice(start-index,end-index) 参数 (Parameters) 接受2个参数,start-index和end

  • 描述 (Description) KnockoutJS Observable splice()方法采用2个参数来指定startindex和end-index。 它从开始到结束索引中删除项目并将它们作为数组返回。 语法 (Syntax) arrayName.splice(start-index,end-index) 参数 (Parameters) 接受2个参数,start-index是起始索引,e

  • 描述 (Description) java.util.regex.Matcher.region(int start, int end)方法设置此匹配器区域的限制。 该区域是输入序列的一部分,将被搜索以查找匹配项。 调用此方法会重置匹配器,然后将该区域设置为从start参数指定的索引处开始,并以end参数指定的索引结束。 声明 (Declaration) 以下是java.util.regex.Mat

  • 我试图提取所有这些标签,其类名符合正则表达式模式frag-0-0,frag-1-0等,从这个输入链接描述在这里 我正在尝试以下代码 这是我的回溯: 回溯(最近一次调用):文件“/home/ubuntu/workspace/vroniplag/vroni.py”,第116行,在op('Aaf')文件“/home/ubuntu/workspace/vroniplag/vroni.py”中,第101行,