Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二进制搜索比较_Java_Algorithm - Fatal编程技术网

Java 二进制搜索比较

Java 二进制搜索比较,java,algorithm,Java,Algorithm,所以我有一些代码可以执行二进制搜索。为什么必须将L和U与进行比较这是一个边缘情况,但这不起作用:大小为1的列表 在这种情况下,我们将有L==U==0。即使该元素恰好是您正在查找的元素,因为while条件不满足L和U可能更好地命名为L和R。它们定义数组未搜索部分的左侧和右侧范围。如果搜索范围缩小到单个元素,则它们将相等,但为了测试最后一个元素,while条件必须保持不变,否则将跳过它 这不仅适用于一个元素的列表。例如,在列表{1,2,3}中搜索元素1。您将检查2,看到它更大,将U减少到0,然后需要

所以我有一些代码可以执行二进制搜索。为什么必须将L和U与
进行比较这是一个边缘情况,但这不起作用:大小为1的列表


在这种情况下,我们将有
L==U==0
。即使该元素恰好是您正在查找的元素,因为
while
条件不满足
L
U
可能更好地命名为
L
R
。它们定义数组未搜索部分的左侧和右侧范围。如果搜索范围缩小到单个元素,则它们将相等,但为了测试最后一个元素,while条件必须保持不变,否则将跳过它


这不仅适用于一个元素的列表。例如,在列表
{1,2,3}
中搜索元素
1
。您将检查
2
,看到它更大,将
U
减少到0,然后需要检查元素
0
,只有在
L==U

时继续检查,大小为1的列表如何?这取决于L和U的初始定义。考虑一下L==U的情况,如果你使用But marcadian,如果A.get(M)==t,我们返回M,那么L==U不应该是一个问题,这是唯一的边缘情况吗?我能想到的唯一的边缘情况。但我不能保证这是唯一存在的边缘案例。@Matt还有许多其他案例,例如数字为0-99的列表搜索1,我将把它留给你和Joe来找出原因。@Oleg Nah,Joe要睡觉了:)
  public static int bsearch(int t, List<Integer> A) {
    int L = 0, U = A.size() - 1;
    while (L <= U) { //******cant I just do: while(L<U) *****?
      int M = (L + U) / 2;
      if (A.get(M) < t) {
        L = M + 1;
      } else if (A.get(M) == t) {
        return M;
      } else {
        U = M - 1;
      }
    }
    return -1;
  }