如 a[M] b[N]
-
最傻瓜式
每一次从b数组中取一值,然后在a数组里逐个比较是否相等,该算法复杂度为 O(MN) -
二分查找
从一个数组中取出值后再另一个数组中用二分查找法找是否有相等的,算法复杂度为O(M * lgN)或 O(N * lgM) -
用hashtable
先把a中的值存在hashtable里,然后对于每一个b中的值,判断是否在a中存在,因为hashtable查找的平均复杂度为 O(1), 所以,整个算法复杂度为O(N), 但是,这里的空间复杂度为 O(M) 。但是,这种方法适合数组比较小的情况。因为如果a数组比较大,hashtable会出现collision的情况,这样,查找的平均复杂度就不再是 O(1)。 -
算法复杂度O(M + N)
void arrayJiao(int ar[], int a_len, int br[], int b_len, int tmp[])
{
int i = 0, j = 0, k = 0;
while(i < a_len && j < b_len)
{
if(ar[i] < br[j])
i++;
if(ar[i] > br[j])
j++;
if(ar[i] == br[j])
{
tmp[k++] = ar[i];
i++;
j++;
}
}
for(i = 0; i < k; ++i)
{
cout<<tmp[i]<<" ";
}
cout<<endl;
}
网友评论