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