从两个数组中查找特定的元素总和

时间:2012-10-24 22:32:37

标签: arrays algorithm search binary

你可以帮我解决这个问题吗? : “设A和B是自然数的递增有序数组,K是任意自然数。找到一个有效的算法,确定所有可能的索引对(i,j),使A [i] + B [j] = K证明算法的正确性并估计其复杂性。“

我应该迭代第一个数组并在另一个数组上进行二进制搜索吗? 谢谢:))

4 个答案:

答案 0 :(得分:6)

没有!

两个数组都是有序的,因此您可以执行以下操作:

  • itA
  • 的开头放置一个迭代器A
  • itB
  • 的末尾放置一个迭代器B
  • 以相反的方向移动迭代器,在每次迭代时测试*itA + *itB。如果该值等于K,则返回两个索引。如果该值小于K,请增加itA。否则,减少itB

当您浏览两个数组时,您将在线性时间内完成。

答案 1 :(得分:1)

因为,对于每个A [i],只能有一个B [j],你可以找到O(n + m)复杂度的解。您可以依赖以下事实:如果(A [i1] B [j1])和(A [i2] B [i2])都是正确的对,并且i1小于i2则j1必须大于j2。希望这会有所帮助。

答案 2 :(得分:0)

我不知道它是否有帮助,这只是一个想法。循环A线性和二进制搜索B,但向后做A。这可能会给你一个更好的最佳情况,因为它能够在A的每一步中排除B的某些部分。

如果你知道A [i]需要说B [42]来解决K,你就会知道A [i-1]需要至少B [43]或更高。

编辑:我还想补充一点,如果B的元素数量少于A,则将其转为并线性地做B线。

答案 3 :(得分:0)

C ++中可能的实现如下:

#include <iostream>
int main()
{
    int A[]={1,2,3,6,7,8,9};
    int B[]={0,2,4,5,6,7,8,12};

    int K=9;
    int sizeB=sizeof B/sizeof(int);
    int sizeA=sizeof A/sizeof(int);


    int i=0;
    int j=sizeB-1;
    while(i<sizeA && j>=0)
    {
        if ((A[i]+B[j])==K){
            std::cout << i<<","<<j<< std::endl;
            i++;
            j--;
        }
        else if((A[i]+B[j])<K){
            i++;
        }
        else{
            j--;
        }
    } 
    return 0;
}