Java 在进行二进制搜索时,如何设置mid元素?
这个问题听起来可能很幼稚。请原谅。我正在研究一个涉及二进制搜索的问题。我学到的一般方法是Java 在进行二进制搜索时,如何设置mid元素?,java,c#,algorithm,data-structures,Java,C#,Algorithm,Data Structures,这个问题听起来可能很幼稚。请原谅。我正在研究一个涉及二进制搜索的问题。我学到的一般方法是 set low = 0, set high = array.Length - 1 while(low < high) mid = (low+high)/2 if (array[mid] == element) return mid if (array[mid] > element) set start = mid +1 if array[mid] < eleme
set low = 0, set high = array.Length - 1
while(low < high)
mid = (low+high)/2
if (array[mid] == element) return mid
if (array[mid] > element) set start = mid +1
if array[mid] < element ) set high = mid
请注意我设置中点的方式。但是,我看到的一些示例/解决方案设置了不同的mid,我无法理解这一点。请参阅下面的代码片段。如能解释设置mid=l+r-l/2意味着什么,我们将不胜感激
int BinarySearch(int A[], int l, int r, int key)
{
int m;
while( l <= r )
{
m = l + (r-l)/2;
if( A[m] == key ) // first comparison
return m;
if( A[m] < key ) // second comparison
l = m + 1;
else
r = m - 1;
}
return -1;
}
这样做是为了避免整数溢出问题 使用非单键右移运算符
int mid=(high+low)>>>1
或
ii int中=低+高-低/2
如果总和超过Integer.MAX_值,则低+高/2将溢出,您将得到错误的结果或运行时异常
您可以阅读Josh Bloch的这篇文章:
中间值等于左值的起始索引加上左右之间的范围除以2 假设我们的范围是5到10
5+10-5/2==5+5/2==5+2.5==7.5,我们的范围的中间值在这两种情况下的目标都是找到中间元素 低+高/2:左右指数之和除以2得到中点。问题是这个总数可能会溢出。 如果总和是偶数,我们选择较低的一个。示例-左侧和右侧为[2,5]-我们选择中间为3 l+r-l/2:找到左索引和右索引之间的差值,并除以2。然后将其添加到左索引以查找中点。用一个例子来形象化这一点可能更容易
示例:[5,11]->11-5/2=3此间隔的中间现在是从左索引开始的3个位置或跳数。因此,添加左边的索引以找到mid元素的索引,即5+3=8这个问题肯定不是java和C中都有。请只标记相关的语言您使用的是java还是C?@不是您我想了解设置中点的逻辑,无论java还是cIf,您只是在寻找逻辑,可能不需要语言标记。或者选择一个特定的。除非绝对相关,否则不要标记多个。@notyou OK请原谅我的语言标记。谢谢Debapriya Biswas。你真棒。这正是我想要的解释: