在Java中用另一个数组查找数组的最快方法是什么?

时间:2010-03-01 19:24:47

标签: java arrays search

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

6 个答案:

答案 0 :(得分:6)

无论数组的元素如何,我​​相信这与字符串搜索问题没什么不同。

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

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

您应该能够找到这些算法的Java实现并使其适应您的问题。

答案 1 :(得分:5)

List<Object> list = Arrays.asList(myArray);
Collections.sort(list);
int index = Collections.binarySearch(list, find);

OR

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;
}

OR

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;
}

OR

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

答案 2 :(得分:2)

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

您应该编写一个名为indexOf的小型库,它接受两个数组,然后您将拥有与indexOf类似的代码。

但不管你怎么做,这都是一个线性搜索。

编辑:

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

问题出现时,你想看看...... aaaaaaaaaaaaaaaaa是否符合(x1000000)...... aaaaaaaaab的字符串(换句话说,字符串往往与搜索字符串中的大部分位置相匹配)。

我的想法是,一旦你找到第一个字符匹配,你只需要一对一地检查所有后续字符,但是当大多数字符在大多数时间匹配时,性能会恶化。在@ a12r的答案中有一个滚动哈希方法,如果这是一个真实世界的问题而不仅仅是一个任务,听起来要好得多。

由于那些很棒的维基百科参考文献,我只想投票给@ a12r的答案。

答案 3 :(得分:0)

通常,您在java中的集合中查找内容的方式是

  • 将它们放在一个hashmap(字典)中,然后用它们的哈希查找它们。
  • 遍历每个对象并测试其相等性

(1)将不适合您,因为数组对象的哈希不会告诉您内容是相同的。你可以编写一些基于内容创建哈希码的包装器(你还必须确保equals返回的值与之一致)。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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