[英]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.