【问题标题】:Searching for the index of an element in an array [duplicate]在数组中搜索元素的索引[重复]
【发布时间】:2015-04-18 15:45:18
【问题描述】:

假设我们有一个对象数组,我想在列表中查找特定对象的索引,一般我会使用方法

public static int findIndex(Object[] arr, Object o) {
    int index = -1;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i].equals(o)) {
            index = i;
            break;
        }
    }
    return index;
}

但是,只有使用 java.lang 包,有没有更快的方法来做到这一点?

【问题讨论】:

  • 更有效的方式是什么意思?什么对你有效? Java 8 中有一个惰性评估,但是当我用您的方法对其进行基准测试时,您的方法更快。
  • 让我改述一下:一种比上述方法运行得更快的方法!谢谢
  • 在 Java 8 中查找 findfirst 并将其与您的方法进行比较,就我测试而言,您会发现您的方法更快
  • 你可以用更少的行来完成,但不会更快,除非你对数组内容有所了解。
  • 搜索算法有很多,但都有自己的假设。例如,如果您的列表要排序,您可以使用二分法。

标签: java


【解决方案1】:

如果您对数据的顺序一无所知,则没有更有效的算法,这是理论上的最优值。你可以 - 使用一些技巧 - 让它快几个百分点。例如:

  • 缓存数组长度
  • 立即返回而不是 break(就性能而言,中断被认为效率不高)。
  • 使用o.equals 而不是arr[i].equals。智能编译器可以缓存ovtable

但很可能编译器本身已经可以派生一些优化。

因此,一个更有效的算法可能是:

public static int findIndex(Object[] arr, Object o) {
    int n = arr.length;
    for (int i = 0; i < n; i++) {
        if (o.equals(arr[i])) {
            return i;
        }
    }
    return -1;
}

虽然差异不会那么大。如果一个tests 两个实现,区别是:

//question first
findIndex (question): 4s 209 469 827
findIndex (answer):   4s 078 955 465
//answer first
findIndex (question): 4s 256 345 171
findIndex (answer):   4s 488 112 895

(由于缓存的原因,首先调用的方法有所不同)。关键是差异不是那么大,并且可以通过操作系统调用和其他服务器任务来改变。因此可以肯定地说,我们谈论的是毫秒级的实际性能差异。

如果数据是有序(通过某种顺序关系),您可以执行binary search

如果您想进行多次查找,您可以先将元素插入HashSet&lt;T&gt;。这个HashSet&lt;T&gt; 的平均查找时间为O(1)(给定一个良好的散列函数)。

【讨论】:

  • 说到 HashSet,还值得一提的是,如果速度是一个主要问题,则可以使用除了 java.lang 之外的任何其他包轻松开发相当健壮和高效的哈希表结构。一个这样的例子是来自算法第4版的SeparateChainingST。它导入 LinkedList 包,但仅作为一种将键集作为可迭代对象返回的惰性方法。您可以轻松制作自己的实现可迭代接口的极简通用队列。
【解决方案2】:

如果您正在寻找 CPU 时间的效率,这是最好的。如果您正在寻找更少的代码行,您可以尝试

theIndex = Arrays.asList(arr).indexOf(o); 

或类似的...

【讨论】:

    【解决方案3】:

    如果集合是有序的,你可以使用二分搜索,这是一种相当简单的搜索算法。

    http://en.wikipedia.org/wiki/Binary_search_algorithm

    这是一个 Java 示例:

    http://www.programmingsimplified.com/java/source-code/java-program-for-binary-search

    【讨论】:

      【解决方案4】:

      您可以使用如上所述的一行代码。这里也有一些信息。

      array.indexOf()

      http://www.tutorialspoint.com/java/java_string_indexof.htm

      【讨论】:

      • OP 想要搜索数组,而不是字符串。这个链接没有解释使用了什么方法以及如何将它与数组一起使用。
      • @Pshemo 对不起,我读得太快了。
      猜你喜欢
      • 2014-03-30
      • 2016-05-24
      • 2020-02-08
      • 1970-01-01
      • 2011-09-08
      • 2013-08-07
      • 2021-01-20
      • 2016-12-22
      • 2017-04-12
      相关资源
      最近更新 更多