Java - 通过Arraylist进行递归二进制搜索

时间:2014-11-23 21:48:26

标签: java search recursion binary

所以我需要一个方法的帮助。使用递归二进制搜索算法搜索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);            
    }
}

这是我到目前为止所做的,但我仍然坚持逻辑部分。任何帮助将不胜感激。

2 个答案:

答案 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

我希望这可以提供帮助。