【问题标题】:Java - Recursive Binary Search through ArraylistJava - 通过 Arraylist 进行递归二进制搜索
【发布时间】:2015-01-21 13:41:39
【问题描述】:

所以我需要方法方面的帮助。使用递归二分搜索算法搜索数组列表。

    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);            
    }
}

这是我目前所拥有的,但我被困在逻辑部分。任何帮助将不胜感激。

【问题讨论】:

    标签: java search recursion binary


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      你来了

      你必须实现一个比较方法来决定你将搜索哪一半。

      我做了一个简单的方法来比较两个字符串..它转换为数字值。

      查看此示例代码:

      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
      

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 2018-07-08
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 2021-03-30
        • 2021-04-28
        • 2020-09-25
        • 1970-01-01
        相关资源
        最近更新 更多