Java 检查两个超长数组是否至少有一个公共元素的最快(运行时)方法?

Java 检查两个超长数组是否至少有一个公共元素的最快(运行时)方法?,java,arrays,processing,Java,Arrays,Processing,我试图检查两个数组是否至少有一个公共元素,我已经尝试了一个解决方案,但速度不够快,它基本上由两个嵌套循环组成,下面是代码: boolean oneElementChecker(int[] pArray1, int[] pArray2) while (i < pArray1.length) { j = 0; if (sameValueChecker) break; while (j < pArray2.length) {

我试图检查两个数组是否至少有一个公共元素,我已经尝试了一个解决方案,但速度不够快,它基本上由两个嵌套循环组成,下面是代码:

boolean oneElementChecker(int[] pArray1, int[] pArray2)
    while (i < pArray1.length) {

      j = 0;

      if (sameValueChecker)
        break;

      while (j < pArray2.length) {

        if ((pArray1[i] == pArray2[j]))
          sameValueChecker = true;

        j++;
      }

      i++;
    }

    return !sameValueChecker;
布尔oneElementChecker(int[]pArray1,int[]pArray2)
而(i

我需要知道是否有办法使这项任务更快。

如果你的意思是像在短期运行时一样快,除非使用预排序数组,否则我认为没有更快的办法

如果您指的是占用更少行的速度(我想输入速度更快),那么使用Java streams的更优雅的方式是:

int[] array1 = ...  
int[] array2 = ...

boolean shared = Arrays.stream(array1).anyMatch(I -> Arrays.asList(array2).contains(i));

如果空间不是问题,那么我可能会建议使用哈希

首先,创建数组pArray1元素的哈希集。(这将在O(n)时间复杂度下完成)

然后,开始遍历第二个数组,对于每个元素,在hashset中查找它是否存在(注意:hashset查找是O(1)操作)。继续遍历,直到在hashset或第二个数组pArray2中找到元素为止


因此,基本上使用散列,您将消除嵌套循环,最终的时间复杂度将为O(n)(O(n)+O(n))。

对于未排序的数组,接受的答案是更好的选择,但如果数组已排序,则按照以下步骤说数组是A[m]和B[n]

1:分别为数组A和B初始化索引i=0和j=0 2:然后按下面的步骤做

if(A[i] == B[i]) {
 //print the common element
} else if(A[i] < B[i]){
 i++  //increment i
} else {
 j++; //increment j
}  
if(A[i]==B[i]){
//打印公共元素
}如果(A[i]
这样,您可以在O(m+n)中的排序数组中找到公共元素。
虽然您也可以在对未排序的数组进行排序后使用此方法,这可能需要O(mLogm+nLogn)时间复杂度,因此如果您可以使用
Collections.disjoint()


result
如果两个指定的集合没有共同的元素,则为true。

为什么不够快?您可以使用
Stream API
parallel()
流处理。对不起,我指的是在短时间运行时最快,如果数组都已排序,该怎么办?有办法吗?
boolean result = disjoint(asList(array1), asList(array2));