两个有序序列的共同元素

来源:互联网 发布:重庆望江工业公司 知乎 编辑:程序博客网 时间:2024/06/06 12:44

问题:

给定两个已排序序列,找出共同的元素.设分别为A,B,数组长度分别为M,N

方法1

定义两个指针分别指向序列的开始。如果指向的两个元素相等,则找到一个相同的元素;如果不等,则将指向较小元素的指针向前移动。重复执行上面的步骤,直到有一个指针指向序列尾端。

大致的code

void CommonElem(const int *A,int ASize,const int *B,int BSize,vector<int>& common)
{
    int i=0,j=0;
    while(i<ASize && j<BSize)
    {
        if(A[i] == B[j])
        {
            common.push_back(A[i]);
            ++i,++j;
        }
        else if(A[i]  > B[j]) ++j;
        else ++i;
    }
}

时间复杂度:O(M+N)

方法2:遍历一个元素个数较小的数组A,对于A[i],在另外一个数组B中二分查找A[i].

而且二分还是可以优化的,如果找到了,就可以重新设置二分查找的低位,没有找到则不变。因为两个数组都是已排序的,下一个出现的数字一定会在当前出现的数字之后。

时间复杂度:小于min(M,N)*log(max(M,N))

 

当两个数组长度接近时候使用方法1,当一个数组长度远大于另外一个的时候使用方法2,当然使用方法2的限制是元素序列是顺序存储。