用于在两个数组中搜索值的算法

时间:2017-10-20 14:34:08

标签: java algorithm

任务: A和B是自然数的数组。 A是递增排序的数组,B是随机排序的数组。 K是一些任意的自然数。找到一种有效的算法,它确定所有可能的索引对(i,j),使得A [i] + B [j] = K.

这种算法效率最高吗?

public static void main(String[] args) {
            int A[] = { 1, 2, 3, 4, 6, 7, 8, 11, 13, 124};
            int B[] = {4, 1, 10, 5};
            int k = 10;
            int i = 0, n = A.length, m = B.length;
            ArrayList<String> result = new ArrayList<String>();
            while (i < n){
                if (A[i] >= k) {
                    break;
                }else {
                    int j = 0;
                    while(j < m) {
                        if (A[i] + B[j] == k) {
                            result.add("i = " + i + " j = " + j);
                        }
                        j++;
                    }
                }
                i++;
            }
            for(int z = 0; z < result.size(); z++) {
                System.out.println(result.get(z));
            }
}

1 个答案:

答案 0 :(得分:6)

不,算法效率不高。当break a A中的k大于a时,您仍然必须测试b和{{的所有组合在此之前,给你的算法一个复杂的O(mn),其中n是A的元素数量,m是B中的元素数量。

相反,我建议如下:

  • 循环遍历b
  • 中的所有元素B
  • 确定a = K - b
  • 使用{{3}}查找aA的索引(如果存在)
  • 如果a中存在A,请打印ab
  • 的索引

这利用了这样一个事实:自A排序后,我们可以快速确定给定的ba是否a + b = k存在于A 1}}。反之亦然,因为B是随机排序的。其总复杂度为O(m log n)。