比较两个排序的int数组

ash*_*ish 12 java arrays int comparison

我有数百万个固定大小(100)的int数组.每个数组都已排序并具有唯一元素.对于每个数组,我想找到所有具有70%公共元素的数组.现在我每秒进行大约100万次比较(使用Arrays.binarySearch()),这对我们来说太慢了.

有谁能推荐更好的搜索算法?

Sea*_*oyd 3

像这样的事情应该可以完成这项工作(前提是数组已排序并且包含唯一元素):

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)

产生显着的差异。优化后,我会重构代码,将其缩减为一两个返回语句。