【问题标题】:What is the fastest way to find an array within another array in Java?在Java中找到另一个数组中的数组的最快方法是什么?
【发布时间】:2010-03-01 19:24:47
【问题描述】:

数组是否有任何等效的 String.indexOf() ?如果没有,除了线性搜索之外,还有什么更快的方法可以在另一个数组中找到一个数组?

【问题讨论】:

  • 您能解释一下您要做什么吗?也许有一个代码示例。
  • 不,没有。以及如何改进对未排序数组的线性搜索?

标签: java arrays search


【解决方案1】:

不管你的数组的元素是什么,我相信这与字符串搜索问题没有太大区别。

article 提供了对各种已知算法的一般介绍。

Rabin-KarpKMP 可能是您的最佳选择。

您应该能够找到这些算法的 Java 实现并根据您的问题调整它们。

【讨论】:

    【解决方案2】:
    List<Object> list = Arrays.asList(myArray);
    Collections.sort(list);
    int index = Collections.binarySearch(list, find);
    

    public static int indexOf(Object[][] array, Object[] find){
      for (int i = 0; i < array.length(); i ++){
        if (Arrays.equals(array[i], find)){
          return i;
        }
      }
      return -1;
    }
    

    public static int indexOf(Object[] array, Object find){
      for (int i = 0; i < array.length(); i ++){
        if (array[i].equals(find)){
          return i;
        }
      }
      return -1;
    }
    

    Object[] array = ...
    int index = Arrays.asList(array).indexOf(find);
    

    【讨论】:

    • 我放置了很多方法,因为您的问题不是 100% 清楚。如果你有一个非常大的集合,我认为第一个选项是最好的。但我建议你为了速度而全力以赴。
    【解决方案3】:

    据我所知,如果没有线性搜索,就无法在另一个数组中找到一个数组。 String.indexOf 使用线性搜索,就在库中。

    您应该编写一个名为 indexOf 的小库,它接受两个数组,然后您将拥有看起来像 indexOf 的代码。

    但无论你怎么做,它都是在幕后进行的线性搜索。

    编辑:

    看了@ahmadabolkader 的回答后,我有点收回了这一点。虽然它仍然是一个线性搜索,但它并不像“实现它”那么简单,除非你被限制在相当小的测试集/结果中。

    当您想查看 ...aaaaaaaaaaaaaaaaab 是否适合 (x1000000)...aaaaaaaaab 的字符串(换句话说,倾向于匹配搜索字符串中大多数位置的字符串)时,问题就出现了。

    我的想法是,一旦找到第一个字符匹配,您只需一对一地检查所有后续字符,但是当大多数字符大部分时间都匹配时,性能会严重下降。 @a12r 的答案中有一个滚动哈希方法,如果这是一个现实世界的问题而不仅仅是一个作业,听起来会好得多。

    由于那些很棒的 Wikipedia 参考资料,我将投票给 @a12r 的答案。

    【讨论】:

    • 假设您在谈论 String.indexOf(String str) - 它似乎 使用简单的逐字符线性搜索(如果您检查 JDK 中包含的 java 代码) ,但在内部,JVM 正在用一个内在函数代替它,它通过创建字符串中存在的所有字符的位图,并尝试仅检查每个第 N 个字符(其中 N 是长度要查找的字符串) - 如果第 N 个字符不在位图中,您可以向前跳过 N 个字符(因为不可能包含该位置的匹配)。
    【解决方案4】:

    简短的回答是否定的 - 没有更快的方法通过使用 Java 中的某些现有结构在数组中查找数组。根据您的描述,考虑创建一个数组HashSet,而不是数组数组。

    【讨论】:

    • 一个 HashSet 数组不会像你想象的那样做。 (另外我认为这不是真正要问的问题;我认为它们的意思是子数组,而不是包含数组的数组作为元素,但我不确定。)
    【解决方案5】:

    通常你在java的集合中查找东西的方式是

    • 将它们放入哈希图(字典)中,并通过它们的哈希值进行查找。
    • 遍历每个对象并测试其相等性

    (1) 对您不起作用,因为数组对象的哈希不会告诉您内容相同。您可以编写某种包装器,根据内容创建哈希码(您还必须确保 equals 返回的值与此一致)。

    (2) 也需要一些工作,因为数组的对象相等性只会测试对象是否相同。您需要用内容测试来包装数组。

    所以基本上,除非你自己写。

    【讨论】:

      【解决方案6】:

      你的意思是你有一个数组,其中的元素也是数组元素?如果是这种情况并且元素已排序,您也许可以使用 java.util.Arrays 中的binarysearch

      【讨论】:

        猜你喜欢
        • 2015-05-11
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多