您的位置:首页 > 其它

两个有序序列的共同元素

2012-11-09 21:47 183 查看
问题:

给定两个已排序序列,找出共同的元素.设分别为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的限制是元素序列是顺序存储。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: