簡體   English   中英

最快(運行時)方式檢查兩個非常長的數組是否至少有一個公共元素?

[英]Fastest (runtime) way to check if two very long arrays have at least one common element?

我正在嘗試檢查兩個數組是否至少有一個公共元素,我已經嘗試了一個解決方案,但它不夠快,它本質上由兩個嵌套循環組成,這里是代碼:

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;

我需要知道是否有辦法讓這項任務更快。

如果空間不是問題,那么我可能會建議使用HASHING。

首先,創建數組pArray1的元素的哈希集。 (這將在O(n)時間復雜度中完成)。

然后,開始遍歷第二個數組,並為每個元素在hashset中查找它是否存在(注意:hashset lookup是O(1)操作)。 繼續遍歷,直到找到hashset中的元素或第二個數組pArray2到達其結尾。

因此,基本上使用散列,您將消除嵌套循環,最終時間復雜度將變為O(n)(O(n)+ O(n))。

如果你的意思是在短時間內運行,除非使用預先排序的數組,我不相信有更快的方法。

如果你的意思是快速占用較少的行(我猜的類型更快),使用Java流更優雅的方式是:

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

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

對於未分類的數組,接受的答案是更好的選擇,但是如果數組已經排序,那么按照這些步驟說數組是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
}  

這樣你就可以在O(m + n)中找到排序數組中的公共元素。 雖然您也可以在排序后使用此方法處理未排序的數組,這可能需要O(mLogm + nLogn)時間復雜度,因此更好地使用散列

如果你可以使用Collections.disjoint()

boolean result = disjoint(asList(array1), asList(array2));

如果兩個指定的集合沒有共同的元素,則result為true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM