【问题标题】:indexOf or Binary Search? [duplicate]indexOf 还是二分搜索? [复制]
【发布时间】:2015-09-10 15:53:57
【问题描述】:

我有一个字符串数组列表,字符串按排序顺序排列,我想查找特定元素的索引,哪个更快?

  1. 执行列表的 indexOf()
  2. 在等效数组中执行二分查找?

【问题讨论】:

  • arraylist 排序了吗?
  • 这是什么语言???
  • 是的,按字母顺序
  • 其实是在java中
  • 为什么要将列表本身的一个操作的性能与“等效数组”的另一个操作的性能进行比较?您可以对列表进行二进制搜索(如果它确实是,如您所说,是一个 ArrayList)。另外,自己试试看

标签: java arraylist binary-search


【解决方案1】:

您可以直接使用Collections.binarySearch以获得更好的效率:

public static <T> int binarySearch(List<? extends Comparable<? super T>> list,
                   T key)

使用二进制在指定列表中搜索指定对象 搜索算法。列表必须按升序排序 根据其元素的自然顺序(如由 sort(List) 方法)在进行此调用之前。如果未排序,则 结果未定义。如果列表包含多个等于 指定的对象,不能保证会找到哪一个。

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

虽然List.indexOf 在 O(n) 时间内运行,但并不关心 List 是否已排序。

【讨论】:

    【解决方案2】:

    如果它已排序,那么您应该使用二进制搜索。 binarySearch() 将是 O(log n) 而不是 indexOf() 的 O(n)

    【讨论】:

      【解决方案3】:

      这取决于您到底在寻找什么。假设您在数组列表中有以下字符串: "a","b","c","d","e","f","g","h","i" 您的二分搜索将打倒一棵看起来像

      的树
                                 e
                               /   \
                             c       g
                            / \     / \
                          b    d   f    h
                         /               \
                        a                 i
      

      因此,根据您要搜索的字符串,您会获得不同的尝试次数,直到找到正确的字符串。随着算法的工作,它从顶部向下运行,并比较搜索到的字符串是否大于或小于它正在测试的字符串,并根据检查左侧(较小)或右侧(较大)的字符串

      但是,如果您下定决心,并且您没有搜索排序列表开头的内容,那么搜索将花费更长的时间。

      【讨论】:

      • 这张图很好地说明了二分搜索的工作原理,请提供一些示例代码以使其更好^_^
      【解决方案4】:

      已经提到二分搜索更好,因为它使用 O(log n)。

      另一个好处是 Collection.binarySearch(...) 是它返回应该插入的位置。因此,如果您将进行插入操作,这是另一个优势。以下是它的工作原理:

      int x = Collection.binarySearch(list, element);
      if(x > 0)
           System.out.println("it exists");
      else
           list.add(element, -x-1);
      

      我不知道你是否需要这个,但我喜欢它:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 2016-11-11
        • 2021-11-14
        相关资源
        最近更新 更多