所以我需要一个方法的帮助。使用递归二进制搜索算法搜索arraylist。
private static < E extends Employee > int binarySearch(ArrayList<E> list, int firstElem, int lastElem, String searchLastName)
{
int middle=0;
if(firstElem > lastElem){
return -1;
}
middle = (firstElem + lastElem) / 2;
if(list.get(middle).getLastName().equals(searchLastName)){
return middle;
}else if( ){ // <-------------?
return binarySearch(list,middle+1,lastElem, searchLastName);
}
else {
return binarySearch(list, firstElem, middle -1, searchLastName);
}
}
这是我到目前为止所做的,但我仍然坚持逻辑部分。任何帮助将不胜感激。
答案 0 :(得分:1)
既然你说你被困在逻辑部分,我认为伪代码答案就足够了。
首先,我假设您的数组按升序排序。如果数组未排序,则无法进行二进制搜索。因为它是经过排序的,所以每次比较都可以将问题大小减少一半。因此,如果答案位于数组的右侧部分,则抛出左侧部分并仅递归到右侧部分。
因为每次递归调用时问题都会变小一半,所以运行时间为O(log n)。
基本逻辑是这样的:
binarySearch(list,begin,end,query)
if (begin > end)
return -1
middle = (begin + end) / 2
if list[middle].value == query
return middle
if list[middle].value < query
return binarySearch(list,begin,middle,query)
return binarySearch(list,middle,end,query)
答案 1 :(得分:0)
你在这里
您必须实施比较方法来决定您将搜索哪一半。
我做了一个比较两个字符串的简单方法..它转换为数字值。
检查此示例代码:
import java.util.ArrayList;
public class BinarySearch {
public static void main(String[] args) {
ArrayList<Employee> arrayList = new ArrayList<Employee>();
for (int i = 0; i < 10; i++) {
Employee employee = new Employee();
employee.setLastName("name" + i);
arrayList.add(employee);
}
System.out.println(arrayList);
System.out
.println(binarySearch(arrayList, 0, arrayList.size(), "name6"));
}
private static <E extends Employee> int binarySearch(ArrayList<E> list,
int firstElem, int lastElem, String searchLastName) {
int middle = 0;
if (firstElem > lastElem) {
return -1;
}
middle = (firstElem + lastElem) / 2;
if (list.get(middle).getLastName().equals(searchLastName)) {
return middle;
} else if (compare(searchLastName, list.get(middle).getLastName()) >= 0) { // <-------------?
return binarySearch(list, middle + 1, lastElem, searchLastName);
} else {
return binarySearch(list, firstElem, middle, searchLastName);
}
}
/**
* Compare to strings.
* @param str1
* @param str2
* @return
*/
public static int compare(String str1, String str2) {
int minLength = Math.min(str1.length(), str2.length());
if (getValue(str1, minLength) > getValue(str2, minLength)) {
return 1;
} else {
return -1;
}
}
/**
* Calculate a value to a string to compare it.
* @param str
* @param length
* @return
*/
public static int getValue(String str, int length) {
int result = 0;
for (int i = 0; i < length; i++) {
char c = str.charAt(i);
result += Math.pow(10, i) * c;
}
return result;
}
}
这是一个示例输出:
[name0, name1, name2, name3, name4, name5, name6, name7, name8, name9]
6
我希望这可以提供帮助。