我有一个带布尔值的数组。但是像这样的元素序列:
首先转到true
个值,然后转到false
个值。
例如,
boolean[] booleans = {true, true, true, true, true,
false, false, false, false, false, false};
现在我们有一个带有布尔值的排序数组,如果true
值存在,则从true
值开始。
任务是找到第一个false
元素。
我使用二分搜索算法创建了一个带有搜索方法的类。
public class BinarySearch {
public static int search(boolean[] array) {
int low = 0, mid = 0;
int high = array.length - 1;
boolean booleanValue;
while (low <= high) {
mid = (low + high) >>> 1;
booleanValue = array[mid];
if (booleanValue) low = mid + 1;
else high = mid - 1;
}
return mid == array.length - 1 ? -(low + 1) : mid;
}
public static void main(String[] args) {
boolean[] booleans = {true, true, true, true, true,
false, false, false, false, false, false};
int search = search(booleans);
System.out.println("search = " + search);
}
}
它无法正常工作,即有时会返回搜索到的前一个元素
通过迭代搜索来查找元素也不是一个好主意,因为数组的大小可能非常大,而且需要很长时间。
编辑:其实我需要在MySQL数据库表中搜索。但是表格大小太大,找到所需的行需要花费很多时间,我想用二进制搜索算法进行紧固。
编辑: MySQL表大小超过4500万行。通过SQL查询搜索所需行时大约需要30秒,无论我是否为列添加了索引。此外,在boolean
中添加索引不会产生任何影响
当我使用二进制搜索时,大约需要10毫秒。所以我希望纠正上述方法
编辑:例如,我有一个名为“INFORMATION”的数据库表。它有两列“INFO”(TEXT)和“CHECKED”(BOOLEAN)。 “INFO”的初始值为false
。我将获得第一个未经检查的信息,并从未选中获得N行,然后我将检查它们并标记它们true
。将重复该过程,直到没有未经检查的信息为止。
答案 0 :(得分:4)
我修改了 Xin Huang 的答案并简化了代码:
public static int search(boolean[] array) {
int low = 0, mid;
int high = array.length - 1;
boolean booleanValue;
while (low <= high) {
mid = (low + high) >>> 1;
booleanValue = array[mid];
if (booleanValue) low = mid + 1;
else if (low == mid) return mid;
else high = mid;
}
return -low;
}
现在,如果找到元素,该方法将返回数组中第一个false
元素的索引,如果找不到元素,则返回负值。
答案 1 :(得分:1)
在循环期间,如果booleanValue为false
修改如下:
while (low <= high) {
mid = (low + high) >>> 1;
booleanValue = array[mid];
if (booleanValue) {
low = mid + 1;
}
else {
if (low == mid) {
break;
}
high = mid;
}
}