【问题标题】:Best way to find value in List when list is sorted排序列表时在列表中查找值的最佳方法
【发布时间】:2010-10-28 10:38:12
【问题描述】:

假设我有一个已排序的 Java ArrayList。现在我想找到值 x 的索引。最快(没有超过 30 行代码)的方法是什么?使用 IndexOf() 方法?在一个简单的 for 循环中遍历所有值?使用一些很酷的算法?我们谈论的是 50 个整数键。

【问题讨论】:

    标签: java algorithm search sorting


    【解决方案1】:

    tvanfosson 是对的,两者的时间都将非常短,因此除非此代码非常频繁地运行,否则不会有太大区别。

    但是,Java 具有用于对列表(包括 ArrayLists)进行二进制搜索的内置功能,Collections.binarySearch

    【讨论】:

      【解决方案2】:
      import java.util.ArrayList;
      import java.util.Collections;
      
      ArrayList myList = new ArrayList();
      // ...fill with values
      
      Collections.sort( myList );
      int index = Collections.binarySearch( myList, "searchVal" );
      

      编辑:未经测试的代码

      【讨论】:

        【解决方案3】:

        Binary search,但既然它只有 50 个项目,谁在乎(除非你必须这样做数百万次)?简单的线性搜索更简单,50 个项目的性能差异可以忽略不计。

        编辑:您也可以使用内置的 java.util.Collections binarySearch 方法。请注意,即使未找到该项目,它也会返回一个插入点。您可能需要进行额外的检查,以确保该项目确实是您想要的。感谢@Matthew 的指点。

        【讨论】:

        • 五十个键,我完全同意。如今,开发人员时间比 CPU 时间更重要。使用 IndexOf() 并继续前进。
        • 除了Java/has/这个功能。
        • 二进制搜索是要走的路。该列表目前可能只有 50 项,但谁知道代码在一两年内必须处理什么......
        • @Matthew -- 不知道 -- 自从我写了很多 Java 以来已经有一段时间了,尽管我昨天刚开始为我正在从事的项目编写一个小程序。会更新。
        • 如果未找到该项目,则返回 (-(插入点) - 1)。所以如果你不关心插入点,只需检查返回值是否为非负数。
        【解决方案4】:

        如果密钥具有可接受的分布,考虑到执行时间,Interpolation Search 可能是非常快速的方法。

        考虑到编码时间IndexOf() 是要走的路(如果适用于您的数据类型(我来自 C#,不懂 Java),则可以使用内置的二进制搜索)。

        【讨论】:

          猜你喜欢
          • 2016-12-03
          • 2010-10-14
          • 2023-03-25
          • 1970-01-01
          • 2019-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          相关资源
          最近更新 更多