ash*_*ish 12 java arrays int comparison
我有数百万个固定大小(100)的int数组.每个数组都已排序并具有唯一元素.对于每个数组,我想找到所有具有70%公共元素的数组.现在我每秒进行大约100万次比较(使用Arrays.binarySearch()),这对我们来说太慢了.
有谁能推荐更好的搜索算法?
像这样的事情应该可以完成这项工作(前提是数组已排序并且包含唯一元素):
public static boolean atLeastNMatchingElements(final int n,
final int[] arr1,
final int[] arr2){
/* check assumptions */
assert (arr1.length == arr2.length);
final int arrLength = arr2.length;
{ /* optimization */
final int maxOffset = Math.max(arrLength - n, 0);
if(arr1[maxOffset] < arr2[0] || arr2[maxOffset] < arr1[0]){
return false;
}
}
int arr2Offset = 0;
int matches = 0;
/* declare variables only once, outside loop */
int compResult; int candidate;
for(int i = 0; i < arrLength; i++){
candidate = arr1[i];
while(arr2Offset < arrLength - 1){
compResult = arr2[arr2Offset] - candidate;
if(compResult > 0){
break;
} else{
arr2Offset++;
if(compResult == 0){
matches++;
break;
}
}
}
if(matches == n){
return true;
}
/* optimization */
else if(matches < n - (arrLength - arr2Offset)){
return false;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
使用示例:
public static void main(final String[] args){
final int[] arr1 = new int[100];
final int[] arr2 = new int[100];
int x = 0, y = 0;
for(int i = 0; i < 100; i++){
if(i % 10 == 0){
x++;
}
if(i % 12 == 0){
y++;
}
arr1[i] = x;
arr2[i] = y;
x++;
y++;
}
System.out.println(atLeastNMatchingElements(70, arr1, arr2));
System.out.println(atLeastNMatchingElements(95, arr1, arr2));
}
Run Code Online (Sandbox Code Playgroud)
输出:
真假
我现在尝试优化上面的代码。请检查代码块是否标记为
/* optimization */
Run Code Online (Sandbox Code Playgroud)
产生显着的差异。优化后,我会重构代码,将其缩减为一两个返回语句。