二进制搜索程序

时间:2016-02-08 22:53:14

标签: java recursion binary-search-tree

代码是一个简单的二进制搜索程序。 我试着追踪程序,但这只会让我更加困惑。我无法弄清楚为什么嵌套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;
}

4 个答案:

答案 0 :(得分:0)

二进制搜索以递归方式搜索左半部(min... mid-1)和右半部(mid+1...max)

您正在midtarget进行检查,这就是为什么它不包含在该范围内的原因。

你真的应该有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)

代码似乎错误地将当前midpointminmax索引进行了比较。相反

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