【问题标题】:Binary search in an ordered list in java [closed]java中有序列表中的二进制搜索[关闭]
【发布时间】:2013-08-09 06:09:25
【问题描述】:

我正在寻找一种在 java 中实现代码的方法,其工作方式与有序 ArrayList 中的二进制搜索相同,但适用于有序列表 谢谢

【问题讨论】:

  • 每个 Java 都有很好的实用程序类,它们的名称很有前途,例如 Collections.binarySearch()Arrays.binarySearch()
  • 您好,如果您被否决,那将是因为您没有表现出任何努力,您应该在发布问题之前尝试解决问题。
  • 这并没有多大意义。 List 不是一种允许随机访问的数据结构,没有它就无法真正进行二进制搜索。
  • 列表不是允许随机访问的数据结构吗?是的。

标签: java list search binary


【解决方案1】:

ArrayListList 的算法应该相同,因为它们都是有序的。

【讨论】:

    【解决方案2】:

    您还应该记住,如果列表未排序,则无法进行二进制搜索。这没有意义。二进制搜索是O(log n),因为您可以随时忽略列表的一半,因为您知道它是有序的。如果列表没有排序,那么你的搜索是 O(n) 并且你不能使用二进制。

    您自己的二分搜索实现应如下所示:

    int binary_search(int A[], int key, int imin, int imax)
    {
      // test if array is empty
      if (imax < imin)
        // set is empty, so return value showing not found
        return KEY_NOT_FOUND;
      else
        {
          // calculate midpoint to cut set in half
          int imid = midpoint(imin, imax);
    
          // three-way comparison
          if (A[imid] > key)
            // key is in lower subset
            return binary_search(A, key, imin, imid-1);
          else if (A[imid] < key)
            // key is in upper subset
            return binary_search(A, key, imid+1, imax);
          else
            // key has been found
            return imid;
        }
    }
    

    来源:Wikipedia

    如果您想使用 Java.util 实现,请使用:

    java.util.Arrays.binarySearch(int[] a, int key)
    

    数组a当然应该排序。

    【讨论】:

    • 我想他确实记得,这就是为什么他在他的问题中使用了“有序”这个词......
    • 那么List和ArrayList有什么区别呢?他是指有序数组还是数组列表?
    • ArrayList 是 List 的一种实现。 List 是一系列元素。 ArrayList 是表示这些元素的一种方式。 LinkedList 是另一个。我认为 ArrayList 将元素保留在类似数组的结构中,因此在任何特定索引处访问元素都很快,但在列表中间插入等一些操作则较慢。 LinkedList 可以更快地插入中间,但更慢地获取列表的第 N 个元素。这些都没有说明元素是否按排序顺序。
    • 是的,我知道。列表是一个接口。所以也许他的意思是array vs arrayList
    【解决方案3】:

    “二分查找”仅在列表的元素(或指向元素的某种指针)在内存中按顺序组织时才有意义,因此如果知道您的搜索已缩小到索引 Low 和 High,您可以直接跳到 (Low + High) / 2 处的元素,而不必费力地穿过所有其他元素。这不适用于一般列表,它可能是 LinkedList。对于这样的事情,你真的不能比从列表的前面开始并按顺序遍历所有元素做得更好。

    【讨论】:

      【解决方案4】:

      你可以使用

      Collections.&lt;T&gt;binarySearch(List&lt;T&gt; list, T key)

      对任何List 进行二分搜索。它适用于ArrayListLinkedList 以及任何其他List

      但是:

      只有当您可以直接访问每个元素时,二分搜索才会很快:

      此方法在 log(n) 时间内运行,用于“随机访问”列表(提供接近恒定时间的位置访问)。如果指定的列表没有实现 RandomAccess 接口并且很大,此方法将执行基于迭代器的二分查找,执行 O(n) 链接遍历和 O(log n) 元素比较。

      如果您的 List 不提供“随机访问”,您可能会通过创建提供此功能的 List 的副本来获得更好的运气。

      LinkedList<String> list = new LinkedList<String>();
      // fill
      

      要么这样

      ArrayList<String> fastList = new ArrayList<String>(list);
      Collections.binarySearch(fastList, "Hello World");
      

      或者可能是这样

      String[] array = list.toArray(new String[list.size()]);
      Arrays.binarySearch(array, "Hello World");
      

      如果您的List 默认没有排序,并且您必须在搜索之前对其进行排序,您可能会通过使用数组来获得最佳结果,因为

      Collections.sort(list);
      

      创建一个临时数组,该数组经过排序并用于重新创建列表,如果您直接使用数组,您应该能够防止该列表。

      String[] array = list.toArray(new String[list.size()]);
      Arrays.sort(array);
      Arrays.binarySearch(array, "Hello World");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多