Java 在具有布尔值的数组中进行二进制搜索
我有一个带有布尔值的数组。但这些元素的顺序如下: 首先执行Java 在具有布尔值的数组中进行二进制搜索,java,binary-search,Java,Binary Search,我有一个带有布尔值的数组。但这些元素的顺序如下: 首先执行true值,然后执行false值。 比如说, boolean[] booleans = {true, true, true, true, true, false, false, false, false, false, false}; 现在我们有了一个带有布尔值的排序数组,如果存在true值,则从true值开始 任务是首先查找false元素。 我使用二进制搜索算法创建了一个带有搜索方法的类 public
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);
}
}
公共类二进制搜索{
公共静态整型搜索(布尔[]数组){
int低=0,中=0;
int高=数组长度-1;
布尔布尔值;
而(低>>1;
布尔值=数组[mid];
如果(布尔值)低=中+1;
否则高=中-1;
}
return mid==array.length-1?-(low+1):mid;
}
公共静态void main(字符串[]args){
布尔[]布尔={true,true,true,true,
假,假,假,假,假,假,假};
int search=搜索(布尔);
System.out.println(“search=“+search”);
}
}
它工作不正常,即有时返回所搜索元素的上一个元素。通过迭代搜索查找元素也不是一个好主意,因为数组的大小可能非常大,而且需要花费很多时间。
编辑:实际上我需要在MySQL数据库表中搜索,但是表的大小太大,查找所需行需要花费很多时间,我想使用二进制搜索算法进行紧固。
Edit:MySQL表大小超过4500万行。通过SQL查询搜索所需行时,无论我是否向列添加索引,都需要大约30秒。此外,在
boolean
中添加索引不会产生任何效果。当我使用二进制搜索时,大约需要10毫秒。因此我希望更正上述方法。
Edit:例如,我有一个名为“INFORMATION”的DB表。它有两列“INFO”(文本)和“CHECKED”(布尔值)。初始值为“INFO”s为
false
。我将获取第一个未选中的信息,并从未选中开始获取N行,然后我将检查它们并将它们标记为true
。该过程将重复,直到没有未选中的信息。在循环期间,如果布尔值为false
while (low <= high) {
mid = (low + high) >>> 1;
booleanValue = array[mid];
if (booleanValue) {
low = mid + 1;
}
else {
if (low == mid) {
break;
}
high = mid;
}
}
while(low>>1;
布尔值=数组[mid];
if(布尔值){
低=中+1;
}
否则{
如果(低==中){
打破
}
高=中;
}
}
我修改了新黄的回答,并将代码简化了一点:
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;
}
公共静态整型搜索(布尔[]数组){
int低=0,中;
int高=数组长度-1;
布尔布尔值;
而(低>>1;
布尔值=数组[mid];
如果(布尔值)低=中+1;
否则,如果(低==中)返回中;
否则高=中;
}
回报率低;
}
因此,现在该方法返回数组中第一个
false
元素的索引(如果找到元素),如果未找到元素,则返回负值。使用调试器。当大小为奇数时,搜索错误?我看不到问题,所以我写了这个;)@AxelH查找第一个假元素为什么要使用二进制搜索查找第一个假元素?!@Null,因为它比线性探测的速度快…?当所有值==true时,此代码仍有一个错误。您可能需要更新特殊情况下的返回值mid==array.length-1
。如果(low==mid){break;},请更改if(low==mid){break;}
toif(low==mid)返回mid
,最后返回return-(low+1);