所以我有一些执行二进制搜索的代码。为什么将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;
}
答案 0 :(得分:3)
这是一个边缘情况,这不起作用:大小为1的列表。
在这种情况下,我们会L == U == 0
。即使那个元素恰好是您正在查找的元素,因为while
条件不满足<
,您的元素永远不会被找到。
答案 1 :(得分:2)
L
和U
可能更好地命名为L
和R
。它们定义了数组未搜索部分的左右范围。如果你的搜索范围缩小到单个元素,那么它们将是相等的,但是为了测试最后一个元素,while条件必须保持,否则你将跳过它。
这不仅适用于一个元素的列表。例如,在列表{ 1, 2, 3 }
中搜索元素1
。您将检查2
,查看它是否更大,将U
减少为0,然后需要检查元素0
,这只有在您继续检查{{1}时才会发生}。