二进制搜索比较

时间:2017-10-11 21:22:55

标签: java algorithm

所以我有一些执行二进制搜索的代码。为什么将L和U与<=进行比较至关重要。我<会得到相同的结果吗?

  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;
  }

2 个答案:

答案 0 :(得分:3)

这是一个边缘情况,这不起作用:大小为1的列表。

在这种情况下,我们会L == U == 0。即使那个元素恰好是您正在查找的元素,因为while条件不满足<,您的元素永远不会被找到。

答案 1 :(得分:2)

LU可能更好地命名为LR。它们定义了数组未搜索部分的左右范围。如果你的搜索范围缩小到单个元素,那么它们将是相等的,但是为了测试最后一个元素,while条件必须保持,否则你将跳过它。

这不仅适用于一个元素的列表。例如,在列表{ 1, 2, 3 }中搜索元素1。您将检查2,查看它是否更大,将U减少为0,然后需要检查元素0,这只有在您继续检查{{1}时才会发生}。