代码是一个简单的二进制搜索程序。 我试着追踪程序,但这只会让我更加困惑。我无法弄清楚为什么嵌套if有数据,min,midpoint-1,&目标 与底部相反if if语句有数据,midpoint + 1,max,target。
public static boolean binarySearch(int[] data, int min, int max, int target){
boolean found = false;
int midpoint = (min + max) / 2; // determine the midpoint
if (data[midpoint] == target)
found = true;
else if (data[midpoint] > target)
{
if (min <= midpoint - 1)
found = binarySearch(data, min, midpoint - 1, target);
}
else if (midpoint + 1 <= max)
found = binarySearch(data, midpoint + 1, max, target);
return found;
}
答案 0 :(得分:0)
二进制搜索以递归方式搜索左半部(min... mid-1)
和右半部(mid+1...max)
。
您正在mid
对target
进行检查,这就是为什么它不包含在该范围内的原因。
你真的应该有if (min >= max) return false;
的基础案例来防止超出数组的范围。
这是一个更清晰的实现,因为我发现它更容易理解
public static boolean binSearch(int[] data, int target) {
return _binSearch(data, target, 0, data.length);
}
private static boolean _binSearch(int[] data, int target, int low, int high) {
int mid = (low + high) / 2;
if (low >= high) return false;
if (data[mid] == target) return true;
boolean foundLeft = _binSearch(data, target, low, mid);
boolean foundRight = !foundLeft && _binSearch(data, target, mid+1, high);
return foundLeft || foundRight;
}
答案 1 :(得分:0)
数组数据已经从最小到最大排序
因此,它会发现中点处的值是否大于目标值,然后目标将显示在中点之前的值中。所以我们只在中点的左边递归调用方法,即从min开始直到中点之前的值的所有值。
类似地,如果中点小于目标,则可以在中点之后找到目标,因此我们仅在中点的右侧递归调用方法,即从中点到结束之后的值的所有值。 / p>
每次我们都不包括在行中检查的中点
if (data[midpoint] == target)
e.g 阵列3 6 8 10 13 14 20.目标= 14 中点将是= 10 9指数4)。检查目标和中点,我们发现目标大于中点并落在右侧。 所以我们现在检查13 14 20中的目标---从中点+ 1(指数5)到结束。 中点为14.并且上面的if语句将返回true。
答案 2 :(得分:0)
您将数据划分为小于midpoint
的一半,范围为(min, mid-1)
且大于midpoint
,范围为(mid+1, max)
。
如果您输入{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31}
和min = 0; max= 10
,那么
int midpoint = (0 + 10) / 2; // which is 5
Iff data[midpoint]
不是您想要的,需要查找或正确的所有内容(但不是midpoint
本身,这就是为什么有{{{ 1}}和-1
在那里..)
所以左半部分的范围是+1
,右半部分的范围是(0, 4)
。
如果您正在寻找,请说12,我们要离开,因为(6, 10)
:
data[midpoint] == 13 && 13 > 12
自int midpoint = (0 + 4) / 2; // which is 2
起,我们就行了data[2] < 10
等等。
答案 3 :(得分:0)
代码似乎错误地将当前midpoint
与min
和max
索引进行了比较。相反
if (min <= midpoint - 1)
:
else if (midpoint + 1 <= max)
应该使用
if (min < midpoint - 1)
:
else if (midpoint + 1 < max)
请尝试以下尝试进行更正:
public static boolean binarySearch(int[] data, int min, int max, int target){
if (max > min) {
int midpoint = (min + max) / 2; // determine the midpoint
if (data[midpoint] == target) {
return true;
}
if (data[midpoint] > target) { // use lower half
return binarySearch(data, min, midpoint-1, target);
}
else { // use upper half
return binarySearch(data, midpoint+1, max, target);
}
}
return false;
}
请参阅DEMO