两个有序序列的共同元素
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的限制是元素序列是顺序存储。
给定两个已排序序列,找出共同的元素.设分别为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的限制是元素序列是顺序存储。
相关文章推荐
- 给定两个已排序序列,找出共同的元素
- 给定两个已排序序列,找出共同的元素
- 数据结构面试题总结4——数组:求两个有序数组中的共同元素
- 整型数组处理算法(五)求两个有序数组的共同元素
- 2-11. 两个有序链表序列的合并(15):链表数据结构基础练习
- 2-12. 两个有序链表序列的交集(20)
- PTA5-53 两个有序序列的中位数
- 合并两个有序序列
- 7-1 两个有序链表序列的合并(20 分)
- 【C】两个有序链表序列的交集
- PTA-两个有序链表序列的交集
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 线性结构1 两个有序链表序列的合并
- 使用两个辅助的队列和非数组变量设计一个算法以使队列中的元素有序
- 2-11. 两个有序链表序列的合并(15) (ZJU_PAT 链表 | vector)
- 两个有序整形数组找出二者相同的元素和不同的元素
- 求两个有序数组的第k小元素
- 7-2 两个有序链表序列的交集
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 找出两个有序数组中相同的元素