对于我的类(class),我需要制作一个同时使用二分搜索和线性搜索的程序。线性搜索工作正常,所以我知道问题不在于所需的搜索词不存在。
我试图找到答案,但这似乎是一个非常独特的问题。
我正在从文件中读取图书列表,并将其放入存储书名和 ID 号的自定义 Books 类中的数组中。我是按身份证号搜索的,只要身份证号是奇数,它就可以正常工作;如果它是偶数,它会创建一个无限循环。
这是有问题的代码。
private String binarySearch(String indexNumber){
int left, middle, right, compare;
String book = null;
Boolean found = false;
left = 0;
right = list.length -1;
while (found == false) {
middle = (left + right) / 2;
compare = list[middle].index.compareTo(indexNumber);
if (compare == 0) {
book = list[middle].title;
found = true;
} else {
if (compare > 0) {
right = middle - 1;
System.out.println("New Right: " + right);
} else {
left = middle + 1;
System.out.println("New Left: " + left);
}
}
}
return book;
}
编辑: 修改后的代码
private String binarySearch(String indexNumber){
int left, middle, right, compare;
String book = null;
left = 0;
right = list.length -1;
while (left <= right) {
middle = (left + right) / 2;
compare = list[middle].index.compareTo(indexNumber);
if (compare == 0) {
book = list[middle].title.toString();
break; //tried a return here and same problem as described below
} else {
if (compare > 0) {
right = middle - 1;
} else {
left = middle + 1;
}
}
}
return book;
}
这修复了无限循环,但它仍然只返回循环之前的空书值(但仅在偶数上,奇数仍然正确显示),即使我将 return 语句放在当前中断的位置。
最佳答案
二分查找的问题在于它坚持要找到一个匹配项;否则,它根本不会退出。
要解决此问题,请替换 found == false
条件为 left <= right
:
while (left <= right) {
...
if (compare == 0) {
book = list[middle].title;
break;
}
...
}
关于java - Binary Search 仅当搜索项为偶数时才创建无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34090328/